数组和指针并不相同(总结于《c专家编程》)

一般我们都认为指针就是一个地址,数组的名字就是数组的首地址,而且很多的时候指针和数组等同,所以我们经常会觉得指针和数组没什么区别。但是,指针和数组是不同的!

例如,char  *p     和     int  a[10];显然,a和p都是一个地址,但a是一个地址,而p是一个地址的地址。  p和a都可以作为左值,但是,你可以给p赋值,你能给a赋值么?(^.^)

亲~指针是一个地址的地址,数组是一个地址哦。接下来~你懂的。

让我们看看char   *p="abcdef";     和     char a[10]="abcdef"; 有什么区别。

p[3]和a[3]和都是'd',  关键之处在于,编译器是怎么访问得到d的呢?

首先,是p[3]。编译器符号表具有一个p,地址为x;

运行时步骤1:取地址x的内容y(y是abcdef这个字符串的首地址);

运行时步骤2:取得i的值(即偏移量),并将它与y相加;

运行时步骤3:取地址[y+i]的内容。

这样就得到'd'了.

然后,如果是a[3];编译器符号表具有一个地址为y;

运行时步骤1:取得i的值(即偏移量),并将它与y相加;

运行时步骤2:取地址[y+i]的内容。

亲,数组是地址,指针是地址的地址,区别有木有,^。^下面还有哦。

在文件1:

char    p[10];                                //定义p是一个数组

在文件2:

extern   char  *p;                           //申明p是一个指针
定义和申明是什么,有什么区别,亲~自己百度哦。

既然把p申明为指针,那么不管原先定义的指针还是数组,你要访问p[i]都会按照上面所示的三个步骤进行操作。p在这里被申明为指针类型,而它原先的定义却是数组,当用p[i]这种形式提取这个申明内容时,实际上p[i]是一个字符,但按照上面三步的方法,编译器会

把它当成一个指针,,把ASICC字符解释成地址显然是错的。它很有可能污染程序地址空间的内容,并出现莫名其妙的错误。所以,定义和申明时,类型一定要相同哦~因为,指针和

数组是不同的。

亲,数组是地址,指针是地址的地址,区别有木有,^。^

posted @ 2011-11-29 20:52  譕捓  阅读(245)  评论(0)    收藏  举报