您的位置:首页 > 编程语言 > C语言/C++

C语言数组与指针的区别

2010-01-26 09:29 309 查看
最近,把《C专家编程》这本书,看完,这本书确实是一本非常好的书,讲述了很多C语言技巧。总之相当精彩。这里,我把数组与指针不能互换的地方总结一下。

首先我们要明白什么是声明,什么是定义。C语言中有且只有一个定义,但是它可以有多个声明(用extern)。因为定义相当于分配了内存,而声明只是说明变量并不是自身,而是在其它地方有它的定义。

下面,我先描述一下定义为指针,但对它的引用为数组的情况。

char *p="abc";

char c=p[1];

假设p的地址为1111,地址里面的4内容为2222,它的运行步骤为:

1、取得编译器符号表具有一个P,地址为1111

2、取得地址1111的内容,即为2222

3、取得p[i]的值1,然后把它与2222相加.

4、取地址2222+1的内容。

本来p[i]表示要对内存进行直接引用的(1111+1),但是它执行的却是对内存的间接引用,原因是我们告诉了编译器,我们此时拥有的是一个指针,所以会引起对内存的间接调用。

如果把p声名为指针,那么不管p原先定义为指针还是数组,都会按照上面四部分执行。

那么现在我再描述一下p原先定义为数组,但是对它的声名却为指针的情况。

char p[]="abcde";

char c=*(p+1);

1、取得编译器符号表具有一个p,地址为1111

2、取得地址1111的内容,即为“abcd”(注意,这里是存放数组数据的内存空间)

3、取得*(p+1)的值1,然后与abcd相加。

4、取地址abcd+1的内容。

如果你对这个地址修改的话,可能会给程序带来非常严重的后果。

--参考资料《C专家编程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: