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 ",p);

return 0;

}

编译器处理指针和数组的不同之处:

在处理指针时:编译器需要做一次寻址操作。在本例中编译器需要对指针p里面存放的地址进行寻址操作。

在处理数组时,编译器直接取数组里面存放的数据,而不是把数组里面存放的内容当做地址再去进行寻址操作。

6、小结:

a、数组在内存中是一片连续的内存空间。

b、数组的地址和数组首元素的地址的意义不同。//你家的GPS地址和你家所在楼栋的GPS地址相同,但是意义不一样。

c、数组名大多数情况下被当成常量指针处理。

d、数组名其实不是指针,在进行外部声明的时候(就像我们上面提到的例子)不能混淆。

原文地址:https://www.cnblogs.com/wan0807/p/4998307.html