数组指针和指针的区别
区分数组指针和指针数组
int *p[3]和 int (*p)[3]
根据运算符的优先级,"[]"的优先级是高于“*”的,p就会先与[]结合,那么它本质就是数组,数组内存放的是指针,它叫指针数组。(int*p[3])。
因为括号优先级较高,p就先和“*”结合,那么它本质上就是指针,叫数组指针,存放的是数组的地址。既然本质是指针,那么它在32位系统里始终占4个字节,就是单纯的一个数组的地址。
(int(*p)[3])。
数组指针
数组指针是一个指向数组的指针。它可以用来访问整个数组,尤其是当我们希望传递数组到函数时。
定义
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr; // ptr是指向一个包含5个整数的数组的指针
使用方法
#include <iostream> void printArray(int (*p)[5]) { // 参数是指向一个包含5个整数的数组的指针 for (int i = 0; i < 5; ++i) { std::cout << (*p)[i] << " "; // 通过解引用访问数组元素 } std::cout << std::endl;
} int main() { int arr[5] = {1, 2, 3, 4, 5}; printArray(&arr); // 传递数组的地址 return 0;
}
数组指针也称行指针,也就是说,当指针p执行p+1时,指针会指向数组的下一行,
如:
int a[3][4];
int (*p)[4]; //p是一个数组指针,指向了一个包含4个int型元素的数组
p=a; //将二维数组的首地址赋给p,即a[0]或a[0][0]
p++; //跨过第一行,p指向了a[1][0]
指针数组
指针数组是一个数组,其中每个元素都是一个指针。它可以用来存储多个指针,这些指针可以指向不同的数据类型或对象
定义
int* ptrs[5]; // ptrs是一个包含5个指向整数的指针的数组
使用方法
#include <iostream> int main() { int a = 10, b = 20, c = 30; int* ptrs[3]; // 指针数组 ptrs[0] = &a; // 指针指向不同的变量 ptrs[1] = &b; ptrs[2] = &c; for (int i = 0; i < 3; ++i) { std::cout << *ptrs[i] << " "; // 解引用指针数组访问值 } std::cout << std::endl; return 0;
}
指针数组是一个包含若干个指针的数组,p是数组名,当执行p+1时,则p会指向数组中的下一个元素。
如:
int a[3][4];
int *p[3]; //定义了一个数组,该数组中有3个int*指针变量,分别为p[0]、p[1]、p[2]
//p++; //若执行此语句,则数组p指向下一个数组元素
for(int i=0;i<3;i++){p[i]=a[i]; //数组p中有3个指针,分别指向二维数组a的每一行
}
总结
数组指针是指向数组的指针,通常用于处理数组作为一个整体,特别是在函数参数中传递整个数组。
指针数组是由指针组成的数组,它可以存储多个独立的指针,可以指向不同的内存位置。