数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合。
指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据。
在大多是C语言书中,都有这样的说法,“数组和指针是相同的”。其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同。
C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容。
定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的地址是40200,首先,取得 i 的值,然后把它与40200相加得到地址40200+i,再取地址40200+i 地址的值。内存中的分布如下:
a | s | d | f | g |
40200 40201 40202 40203 40204
Code
定义一个指针 char *p="asdfghjkl";现在访问第 i 个字符,
1 #include<stdio.h> 2 #include<stdlib.h> 3 char *p="asdfghjkl"; 4 int main() 5 { 6 int i=3; 7 printf("&p=%x ",&p); 8 printf("p=%x ",p); 9 printf("&p[i]=%x ",&p[i]); 10 system("pause"); 11 return 0; 12 }
这两种方法都能取得一个字符,但这两种方法非常不一样的,第二种方法其实是指针访问方式和数组访问方式的结合。先在编译器符号表中找到一个符号p,先取得该符号所代表地址里的内容,以该内容作为地址并与偏移量相加,得到字符的地址,取该地址内容便得到字符。
如果把符号p声明为一个指针 extern char *p;则无论它原来的定义是数组还是指针,都会按第二种方式来访问。但是,只有当符号p原来被定义为指针时,访问才是正确的,如果他原来被定义是数组,这儿却以指针来访问,毫无疑问,必将导致错误的结果。