1、数组的概念
定义:数组是相同类型变量的有序集合
老师语录:数组只有遇到sizeof 和&两种情况才不会退化,否则均退化为指向首元素的指针。
所以,比如写个程序
#include <stdio.h>
int main()
{
int a[5] = { 0 };
printf("sizeof(a) = %d\n", sizeof(a)); 提出问题:a是指数组首元素地址还是数组名?
return 0;
}
根据我上面的老师语录,推出数组名遇到sizeof、&就只表示整个数组,其余都表示数组首元素的地址。
2、数组地址与数组名
- 数组名 代表数组首元素地址
- 数组的地址 需要&才能得到
- 数组首元素的地址与数组的地址值相同
- 数组首元素的地址与数组的地址是两个不同的概念
#include <stdio.h>
int main()
{
int a[5] = { 0 };
printf("a = %p\n", a); //数组首元素的地址
printf("&a = %p\n", &a); //整个数组的地址
printf("&a[0] = %p\n", &a[0]); //数组首元素的地址
return 0;
}
第 6 条语句和第 8 条语句其实是一个意思。
3、数组名的盲点
- 数组名可以看做一个指针常量
- 数组名指向的是内存中数组首元素的起始位置
- 数组名不包括数组的长度信息
- 在表达式中数组名只能作为右值使用
#include <stdio.h>
int main()
{
int a[5] = { 0 };
int b[2];
int* p = NULL;
p = a; //作为右值使用
printf("a = %p\n", a);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(p) = %d\n", sizeof(p));
printf("\n");
p = b;
printf("b = %p\n", b);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("sizeof(b) = %d\n", sizeof(b));
printf("sizeof(p) = %d\n", sizeof(p));
// b = a;
return 0;
}