欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言—数组名和首元素地址区别

程序员文章站 2022-04-11 18:54:25
...

一.数组名字在两种情况下才代表数组本身----即该段连续的空间

1.对数组名进行取地址
2.数组名出现在sizeof之后

二.其余数组名表示首元素的地址

比如:函数传参—>int*

int main()
{
	int array[] = { 1, 2, 3, 4, 5 };
	
	int* p1 = array;
	int* p2 = array + 0;
	int* p3 = &array[0];

	printf("%d\n", p1);
	printf("%d\n", p2);
	printf("%d\n", p3);

	system("pause");
	return 0;

结果:三个表达式都是一样的。

三.综合例题

#include<stdio.h>

//void PrintArray(int array[], int size)
void PrintArray(int *array, int size)	//打印
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", array[i]);
	}
	printf("\n");
}

int main()
{
	int array[] = { 1, 2, 3, 4, 5 };
	int* p1 = (int*)(&array + 1);	//&array表示数组本身,+1表示下一个地址
	int* p2 = (int*)(array + 1);	//array表示首元素的地址,+1表示第二个元素的地址
	char* p3 = NULL;

	int a = p1[-2] + *p2 + sizeof(&array) + sizeof(*p3);	//a=4+2+4+1=11

	//printf("%d", *p3);	//崩溃
	printf("%d\n", a);

	//在传参期间数组名已经退化为首元素的地址
	PrintArray(array, sizeof(array) / sizeof(array[0]));
	system("pause");
	return 0;
}

思路:
在a的表达式中

p1[-2]相当于*(p1-2)4
sizeof(array) = 5 * sizeof(int) = 20;
sizeof(&array) = 4;	//&array为指针

疑问:p3是空指针,在sizeof之后解引用程序为什么没有崩溃?
答案:sizeof在计算表达式求值期间,不会真正对指针解引用的。
因为sizeof之后跟的是类型的大小,sizeof(*p3)相当于是sizeof(char),为1

所以a=4+2+4+1=11

相关标签: C