数组的概念:

 

数组当中的元素没有名字,我们只能通过数组名和下标来访问数组中的元素。数组名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\n", a[2]);
 9     printf("a[3] = %d\n", a[3]);
10     printf("a[4] = %d\n", a[4]);
11     
12     printf("sizeof(a) = %d\n", sizeof(a));
13     printf("sizeof(b) = %d\n", sizeof(b));
14     printf("count for a: %d\n", sizeof(a)/sizeof(int));
15     printf("count for b: %d\n", 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\n", a);
 8     printf("&a = %p\n", &a);
 9     printf("&a[0] = %p\n", &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\n", a);
12     printf("p = %p\n", p);
13     printf("&p = %p\n", &p);
14     printf("sizeof(a) = %d\n", sizeof(a));
15     printf("sizeof(p) = %d\n", sizeof(p));
16    
17     printf("\n");
18 
19     p = b;
20     
21     printf("b = %p\n", b);
22     printf("p = %p\n", p);
23     printf("&p = %p\n", &p);
24     printf("sizeof(b) = %d\n", sizeof(b));
25     printf("sizeof(p) = %d\n", sizeof(p));
26     
27     b = a;
28   
29     return 0;
30 }

第27行是错误的,去掉错误行,编译运行。

运行结果如下:

 

sizeof对指针和数组名操作时,结果是不一样的。

小结:

 

posted on 2018-08-26 17:51  周伯通789  阅读(365)  评论(0编辑  收藏  举报