数组的概念
在C语言中:
- 数组是相同类型的变量的有序集合
数组大小
- 数组在一片连续的内存空间中存储元素
- 数组元素的个数可以显示或隐式指定
例:
int a[5] = {1, 2};
int b[] = {1, 2};
问题:
1. a[2], a[3], a[4] 的值是多少?
2. b包含了多少元素
/* 测试代码 */
#include <stdio.h>
int main()
{
int a[5] = {1, 2};
int b[] = {1, 2};
printf("a[2] = %d\n", a[2]); // a[2] = 0
printf("a[3] = %d\n", a[3]); // a[3] = 0
printf("a[4] = %d\n", a[4]); // a[4] = 0
printf("sizeof(a) = %d\n", sizeof(a)); // sizeof(a) = 20
printf("sizeof(b) = %d\n", sizeof(b)); // sizeof(b) = 8
printf("count for a: %d\n", sizeof(a)/sizeof(int)); // count for a: 5
printf("count for b: %d\n", sizeof(b)/sizeof(int)); // count for b: 2
return 0;
}
运行结果
a[2] = 0
a[3] = 0
a[4] = 0
sizeof(a) = 20
sizeof(b) = 8
count for a: 5
count for b: 2
数组的分析1: 数组地址与数组名
数组名代表数组首元素的地址
数组的地址需要用取地址符 & 才能得到
数组首元素的地址值与数组的地址值相同
数组首元素的地址与数组的地址是两个不同的概念
/* 测试代码 */
#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;
}
运行结果
a = 0022FF1C
&a = 0022FF1C
&a[0] = 0022FF1C
数组的分析2:数组名的盲点
数组名可以看做一个常量指针 (注意: 数组名并不是指针)
数组名 “指向” 的是内存中数组首元素的起始位置
数组名不包含数组的长度信息
在表达式中数组名只能作为右值使用
只有在下列场合中数组名不能看做常量指针
数组名作为 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)); // sizeof(a) = 20 (由此可知, 数组名并不是指针)
printf("sizeof(p) = %d\n", sizeof(p)); // sizeof(p) = 4
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));
return 0;
}
运行结果
a = 0022FF1C
p = 0022FF1C
&p = 0022FF10
sizeof(a) = 20
sizeof(p) = 4
b = 0022FF14
p = 0022FF14
&p = 0022FF10
sizeof(b) = 8
sizeof(p) = 4