指针是C/C++语言中最难也是最重要的部分,而指针与数组又存在千丝万缕的联系,同时也存在使用上的区别,本文即对两者进行比较,仅作抛砖引玉之用。
1、存储内容:
- 指针:保存数据的地址
- 数组:保存数据
-
int n = 12; int *p = &n; //p存储n的地址 int a[12] = {1,2}; //数组a直接存储数据
2、访问数据:
- 指针:间接访问数据, 首先获取指针的内容(存储的是地址), 然后把它作为地址,接着从这个地址中获取数据; 如果指针是一个下表[i],就把指针的内容加上i个偏移单位作为地址,从中获取数据
指针通常指向匿名数据。
- 数组: 直接访问数据,a[i] 表示以 a+i*sizeof(a[0]) 为地址取得数据
数组自身即为数据名。
3、用途:
- 指针:通常用于动态数据结构
- 数组:通常用于存储固定数目且数据类型相同的元素
4、相关函数:
- 指针:malloc(), free(), realloc(),alloc()
- 数组:隐式分配和删除
5、初始化:
指针和数组都可以在定义的时候进行初始化,但机制不同。
- 指针:定义指针的时候,编译器并不为指针所指向的对象分配空间(除了给指针赋一个字符串常量外),只分配指针本身的空间。同时在初始化指针时,所创建的字符串常量定义为只读类型。如果试图通过指针进行修改该字符串的值,程序会出现未定义的行为(一般来说,字符串常量放置在只读文本段中)。
- 数组:有字符串常量初始化的数组可以进行修改。
-
char *p = "Hello World"; //p被初始化为"Hello World",该字符串存储在常量段中,不允许修改 p = "Such"; //未定义行为,不能对p进行修改
float *fp = 25.6; //无法编译 char a[] = "HelloWorld!"; strncpy( a, "This ", 5 ); //数组的值被修改为 “This World!”