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;
}

运行结果:



猜你喜欢

转载自blog.csdn.net/hdong99/article/details/79921647
今日推荐