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专家编程》
首先我们要明白什么是声明,什么是定义。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专家编程》
相关文章推荐
- C语言中数组名和指针的区别
- C语言 指针与数组的详解及区别
- C语言中函数返回数组;数组与指针的区别
- C语言中的字符指针与字符数组的一点区别
- C语言:数组和指针的区别
- 从编译器角度分析C语言中数组名和指针的区别
- C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别
- c语言核心整理之指针与数组的区别
- c语言中数组和指针的区别与联系
- c语言中字符数组和字符指针的区别
- c语言中数组名与指针的区别与联系
- C语言字符串指针与字符数组的区别
- C语言:数组和指针的区别
- 【转】C语言中数组名和指针的区别
- c语言中字符串常见初始化时的问题,以及字符串数组与指针区别的分析
- 【C++11】再认识C语言中的指针与数组的区别
- C语言中指针与数组的区别与联系
- 转-C语言中使用指针与数组的区别
- C语言中数组名和指针的区别
- C语言——指针与数组区别