2015-11-26 数组基础听课笔记
1、关于数组的大小:
在C语言中声明一个数组时需要指定其大小(柔性数组除外),数组的大小有两种指定的方式:
a、显式指定数组大小
eg:int a[5]={1,2};
即在声明数组的时候,就在数组的长度方括号[]内填写数组的长度,这种方式就是显式的指定数组大小的方式。
b、隐式指定数组大小
eg:int b[] ={1,2};
即在声明数组时,不在方括号内填写数组长度,但在后面给数组初始化值,这时候数组的长度就是花括号{}内所有元素的个数。
2、关于数组的初始化:
这个时候,有人不禁要问了,在我们显式指定数组大小时,int a[5]={1,2};既然声明了数组长度为5,前两个元素分别为1和2,那么剩下的元素的值是什么呢?
有人会说,剩下元素的值是随机值,我们经过试验证明,这种说法是不对的,剩下的元素的值都为0。
那么假如我们这样进行显式指定数值长度呢?int a[5];
老师在linux下运行的结果,显示数组里面的元素的值都是随机的,而我在vs下运行发现数组元素的值全为0。反正不管怎样,这样就说明,以上这种声明数组的方式,数组里面的元素的值是不确定的。
那么我们在声明数组的时候就要对其进行初始化操作。那么怎么进行初始化操作呢?
我们就利用刚才我们说过的数组的第一个特性。假如我们显式的声明数组的长度的时候,同时给数组里面的一些元素赋初始值,那么剩下的元素的值就会被初始化为0。
那么这里我们就应该这样来进行初始化:例如我们要定义一个数组c,数组里面有100个元素,但是我们现在也不知道数组里面的元素是什么,所以我们想要就里面的元素的值全部初始化为0。
int c[100]={0};
这样,我们将第一个元素初始化为0,那么剩下的元素也就会被初始化为0了。
3、关于数组的一些说明:
a、数组名仅代表数组首元素的地址,而不是数组的地址。
b、数组的地址需要用取地址符&+数组名才能得到。
c、数组首元素的地址与数组的地址的值相同。
d、数组首元素的地址与数组的地址是两个不同的概念。
4、数组名的盲点:
a、数组名在某些情况下可以看做(只能是看做)一个常量指针,但是数组名不是指针。
b、数组名“指向”的是数组中首元素的起始位置。
c、在表达式中,数组名只能作为右值使用。
d、只有在下列场合,数组名不能看做常量指针:
i、数组名作为sizeof 的操作数。sizeof(数组名)得到的是整个数组所占的内存空间大小。
ii、数组名作为&运算符的操作数。&数组名得到的是数组的地址。
思考:
int a[5];
int b[5];
a=b;
在C语言中为什么不用以上这种方式复制数组?
//在表达式中数组名只能作为右值使用。
5、实例分析:
another.c:
char *p = "Hello~World";
tst.c:
#include <stdio.h>
extern char p[];
int main()
{
printf("%s\n",p);
return 0;
}
编译器处理指针和数组的不同之处:
在处理指针时:编译器需要做一次寻址操作。在本例中编译器需要对指针p里面存放的地址进行寻址操作。
在处理数组时,编译器直接取数组里面存放的数据,而不是把数组里面存放的内容当做地址再去进行寻址操作。
6、小结:
a、数组在内存中是一片连续的内存空间。
b、数组的地址和数组首元素的地址的意义不同。//你家的GPS地址和你家所在楼栋的GPS地址相同,但是意义不一样。
c、数组名大多数情况下被当成常量指针处理。
d、数组名其实不是指针,在进行外部声明的时候(就像我们上面提到的例子)不能混淆。