在 C 语言中,咱们不可避免的要接触到数组。咱们就来看看数组是什么玩意,其实数组就是相同类型的变量的有序集合。下面这张图更加形象的表示出数组的含义数组
数组在一片连续的内存空间中存储元素,数组元素的个数是能够显示或隐式指定的。好比: int a[5] = {1, 2}; int b[] = {1, 2};那么问题来了,数组 a 中其他没指定的三个数是多少呢?数组 b 到底包含了多少个元素呢?咱们下来作个实验看看是怎样的,代码以下ide
#include <stdio.h> int main() { int a[5] = {1, 2}; int b[] = {1, 2}; 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; }
编译后结果以下学习
那么咱们看到编译器默认指定数组后面没指明的元素全都为0,而隐式指定的数组的大小就是它们所包含的元素的个数。spa
那么接下来咱们来看看数组地址与数组名的关系。数组名表明数组首元素的地址,数组的地址须要用取地址符 & 才能获得;数组首元素的地址与数组的地址值相同,可是数组首元素的地址与数组的地址是两个不一样的概念。咱们来作个实验,能够更加清晰的理解这段所说的概念,代码以下3d
#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; }
编译结果以下指针
咱们看到三个地址相同。数组名表明首元素的首地址,在这块,第一个和第三个就是相同的意义。可是第二个和他们所表明的意义不相同。举个例子来讲,举行人大时,每一个人表明他们各自的省份,在这时他一我的就能够表明他们的省份的意见。但你能说他和他的省份是一个概念嘛,显然是不同的,只是在特定环境下仅仅相同罢了。blog
接下来咱们介绍个有趣的,数组名其实能够看作一个常量指针。数组名“指向”的是内存中数组首元素的起始位置,但数组名不包含数组的长度信息;在表达式中数组名只能做为右值使用,只有在如下两种场合中数组名不能看作是常量指针:a> 数组名做为 sizeof 操做符的参数;b> 数组名做为 & 运算符的参数。下来咱们再作个示例代码分析下,代码以下图片
#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; }
咱们在第9行将数组名 a 赋值给指针 p,这是没错的,由于数组名能够看作是数组首元素的首地址。咱们接着经过打印 a 和 p 的地址应该是相同的,可是指针也是变量,它自身也有地址,因此第13行打印出来的应该和前两个地址不相同。接下来打印数组 a 的大小应该是20,指针 p 的大小应该是 4。显示指定的数组 a 和 隐式指定的数组 b 的状况应该是相同的。但第27行是两个数组名进行赋值操做,这确定会出错。从另外一个角度看,咱们前面说了数组名能够看作是一个常量指针,那么咱们将常量指针赋值给另外一个常量指针确定会出错啊。接下来咱们看看编译结果内存
编译报错,咱们注释掉第27行,再次编译编译器
咱们看到结果和咱们分析的是一致的。经过对数组的学习,总结以下:一、数组是一片连续的内存空间;二、数组的地址和数组首元素的地址意义不一样;三、数组名在大多数状况下被当成常量指针处理,单数数组名并非指针,不能将其等同于指针。
欢迎你们一块儿来学习 C 语言,能够加我QQ:243343083。