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
上一篇: 简单认识一下JavaScript!
下一篇: 集合的简单认识
推荐阅读