指针数组和数组指针¶
参考:C语言指针数组和数组指针
- 指针数组是数组,数组中的每个成员是指针,其所占内存字节数由数组大小决定
- 数组指针是指针,即指向数组的指针,其所占内存字节数固定(
64
位系统下为8
字节)
声明¶
指针数组声明:长度为LENGTH
的保存int
类型指针的数组
int *p[LENGTH];
数组指针声明:指向长度为LENGTH
的数组的指针
int (*p)[LENGTH];
由于运算符的优先级,所以先执行p[]
,再执行*p
- 对于指针数组而言,声明了
int*
类型的p[LENGTH]
数组 - 对于数组指针而言,声明了
int[]
类型的*p
指针
所占内存¶
const int LENGTH = 3;
const int WIDTH = 2;
int arr[LENGTH] = {1, 2, 3};
int *p[LENGTH];
int (*p2)[LENGTH];
cout << sizeof(p) << endl;
cout << sizeof(p2) << endl;
}
数组长度为3
,所以指针数组p
的内存大小为8*3=24
,数组指针p2
的内存大小为8
赋值¶
指针数组¶
const int LENGTH = 3;
const int WIDTH = 2;
int *p[WIDTH];
for (int i = 0; i < WIDTH; i++) {
p[i] = new int[LENGTH];
for (int j = 0; j < LENGTH; j++) {
p[i][j] = i + j + 1;
cout << p[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < WIDTH; i++) {
delete[] p[i];
}
指针数组p
的长度为WIDTH
,
- 首先为每个成员指针新建内存空间,长度为
LENGTH
- 再进行赋值/取值操作
- 最后遍历整个数组,依次销毁内存空间
数组指针¶
const int LENGTH = 3;
const int WIDTH = 2;
int (*p)[LENGTH][WIDTH]={};
int arr[LENGTH][WIDTH]={};
cout << p << endl;
p = &arr;
for (int i = 0; i < LENGTH; i++) {
for (int j = 0; j < WIDTH; j++) {
arr[i][j] = i + j + 1;
}
}
for (int i = 0; i < LENGTH; i++) {
for (int j = 0; j < WIDTH; j++) {
cout << (*p)[i][j] << " ";
}
cout << endl;
}
数组指针p
声明为int[LENGTH][WIDTH]类型
,声明后其地址为0
,所以需要将二维数组arr
的地址赋值给p
0
1 2
2 3
3 4