C语言中指针和数组的区别
看《C专家编程》一书,看到数组与指针并不相同一章,遂做了一段测试:
代码:
#include <stdio.h> #include <stdlib.h> int main(void) { char *p = "abcdefghijklmn"; printf("%p\n%p\n%p\n",&p,&p[0],p); return 0; }
输出:
可以看到这样的输出,结果很显然:
第一个输出的值,0028FF24,应该是符号表中p的地址。
第二个值,00403000,是地址0028FF24中储存的值,也就是指针p所指向的地址。
第三个值,可以看到和第二个值是一样的,也就是说字符串指针p所指向的内容的起始地址为00403000,同样也验证了之前所说的。
在此总结一下指针与数组的区别:
(1)指针保存数据的地址(准确的说应该是起始地址),而数组保存数据。
(2)指针间接访问数据,首先获取指针的内容(该内容就是实际数据的地址),然后以之为地址,从这个地址提取数据。如果指针有一个下标[i],那就把指针的内容加上i作为地址,从中提取数据。而数组则直接访问数据,a[i]是简单的以a+i为地址取得数据。
(3)指针用于动态结构数据,而数组用于存储固定数目且数据类型相同的元素。
(4)指针相关的函数有malloc与free,而数组隐式分配和删除。
(5)指针一般指向匿名数据,而数组自身即为数据名。
指针和数组都可以通过定义时使用字符串常量进行初始化,但是两者是有区别的:
在ANSI C中,初始化指针时所创建的字符串常量通常是只读的,无法修改;而由字符串常量初始化的数组是允许修改的,其中的单个字符可以在以后改变。