1 数组的概念
数组是相同类型的变量的有序集合。
2 数组的大小
- 数组在一片连续的内存空间中存储元素。
- 数组元素的个数可以显示或隐式指定。
int a[5] = {1, 2};
int b[] = {1, 2};
问题:
1. a[2], a[3], a[4]的值是多少? 0,0,0
2. b中包含了多少元素? 2
编程实验:数组的初始化
#include <stdio.h>
int main()
{
int a[5] = {1, 2};
int b[] = {1, 2};
//int a[4] = 0; //error: invalid initializer
printf("a[2] = %d\n", a[2]);
printf("a[3] = %d\n", a[3]);
printf("a[4] = %d\n", a[4]);
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(b) = %d\n", sizeof(b));
printf("count for a: %d\n", sizeof(a)/sizeof(int));
printf("count for b: %d\n", sizeof(b)/sizeof(int));
return 0;
}
3 数组地址与数组名
- 数组名代表数组首元素的地址。
- 数组的地址需要用取地址符&才能得到。
- 数组首元素的地址值与数组的地址值相同。
- 数组首元素的地址与数组的地址是两个不同的概念。
编程实验:数组名和数组地址
#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;
}
4 数组名的盲点
- 数组名可以看做一个常量指针。
- 数组名“指向”的是内存中数组首元素的起始位置。
- 数组名不包括数组的长度信息。
- 在表达式中数组名只能作为右值使用。
- 只有在下列场合中数组名不能看作常量指针:
- 数组名作为sizeof操作符的参数;
- 数组名作为&运算符的参数。
实例分析:数组和指针并不相同
#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; // error
return 0;
}
5 小结
- 数组是一片连续的内存空间。
- 数组的地址和数组首元素的地址意义不同。
- 数组名在大多数情况下被当成常量指针处理。
- 数组名其实并不是指针,不能将其等同于指针。
注意:概念的混淆是BUG的根源之一!