数组的概念:
数组当中的元素没有名字,我们只能通过数组名和下标来访问数组中的元素。数组名a代表的是这5个存储空间的集合。代表的是这一段内存。
数组的大小:
示例程序:
1 #include <stdio.h> 2 3 int main() 4 { 5 int a[5] = {1, 2}; 6 int b[] = {1, 2}; 7 8 printf("a[2] = %d ", a[2]); 9 printf("a[3] = %d ", a[3]); 10 printf("a[4] = %d ", a[4]); 11 12 printf("sizeof(a) = %d ", sizeof(a)); 13 printf("sizeof(b) = %d ", sizeof(b)); 14 printf("count for a: %d ", sizeof(a)/sizeof(int)); 15 printf("count for b: %d ", sizeof(b)/sizeof(int)); 16 17 return 0; 18 }
运行结果如下:
当我们指定数组中的一部分元素之后,其他的元素就会被初始化为0,我们可以利用这个特性来讲数组全部初始化为0。做法为int a[5] = {0}; 我们将第一个元素初始化为0,其他的元素由编译器默认初始化为0。
数组地址与数组名:
数组的地址需要用取地址符&才能得到。数组首元素的地址与数组地址在值上是一样的,但是它们的意义却不相同。
示例程序:
1 #include <stdio.h> 2 3 int main() 4 { 5 int a[5] = { 0 }; 6 7 printf("a = %p ", a); 8 printf("&a = %p ", &a); 9 printf("&a[0] = %p ", &a[0]); 10 11 return 0; 12 }
运行结果如下:
地址其实隐含两个概念,第一是起始地址,第二是长度。
a表示第一个元素的起始地址,长度为4。
&a表示数组的起始地址,长度为20。
数组名的盲点:
数组名可以看做是一个常量指针,但是使用起来并不是常量指针。
示例程序:
1 #include <stdio.h> 2 3 int main() 4 { 5 int a[5] = {0}; 6 int b[2]; 7 int* p = NULL; 8 9 p = a; 10 11 printf("a = %p ", a); 12 printf("p = %p ", p); 13 printf("&p = %p ", &p); 14 printf("sizeof(a) = %d ", sizeof(a)); 15 printf("sizeof(p) = %d ", sizeof(p)); 16 17 printf(" "); 18 19 p = b; 20 21 printf("b = %p ", b); 22 printf("p = %p ", p); 23 printf("&p = %p ", &p); 24 printf("sizeof(b) = %d ", sizeof(b)); 25 printf("sizeof(p) = %d ", sizeof(p)); 26 27 b = a; 28 29 return 0; 30 }
第27行是错误的,去掉错误行,编译运行。
运行结果如下:
sizeof对指针和数组名操作时,结果是不一样的。
小结: