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中,初始化指针时所创建的字符串常量通常是只读的,无法修改;而由字符串常量初始化的数组是允许修改的,其中的单个字符可以在以后改变。

原文地址:https://www.cnblogs.com/chrischeng/p/3253031.html