C语言数组与指针的关系

首先来看一段程序:

#include <stdio.h>

int main()
{
	int arr[10] = {1,2,3,4};
	int *p = arr;
	
	printf("%d\n",arr[2]);
	printf("%d\n",*(arr + 2));
	printf("%d\n",p[2]);
	printf("%d\n",*(p + 2));

	return 0;
}

运行结果为:

可以看到结果相同,我们可以理解为arr[i] == *(arr + i)==p[i]==*(p + i)

为什么会出现这种情况呢?

在C语言中,数组名代表的是数组中首元素的地址,即在此时数组名是指向首元素的指针(地址)

在程序编译时,arr[i] 是按照 *(arr + i)处理的,即按照数组元素的首地址加上相应位移量找到新元素的地址,然后解引用,便

得到此处的值。(指针的算术计算可参考我的C语言指针算术运算)

那指针和数组名有什么区别用法呢?

数组名指向首元素地址,但指针可以不指向首元素地址,于是就出现下面的应用

#include <stdio.h>

int main()
{
	int arr[10] = {1,2,3,4};
	int *p = &arr[1];

	printf("%d\n",*p);
	printf("%d\n",*(p+1));
	printf("%d\n",p[-1]);

	return 0;
}

结果为:

此时,数组与指针关系已经清楚,但是数组名一定代表的是首元素地址吗?

答案是不一定

数组名在下列两种情况下表示整个数组:

1.在定义数组的同一个函数中,求sizeof

2.在定义数组的同一个函数中,&arr+1

看下面源代码:

#include <stdio.h>

int main()
{
	int arr[10] = {1,2,3,4};
	
	printf("%d\n",sizeof(arr));
	printf("%d,%d\n",&arr,&arr+1);

	return 0;
}

运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值