数组和指针并不相同(总结于《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字符解释成地址显然是错的。它很有可能污染程序地址空间的内容,并出现莫名其妙的错误。所以,定义和申明时,类型一定要相同哦~因为,指针和
数组是不同的。
亲,数组是地址,指针是地址的地址,区别有木有,^。^