数组指针和指针数组
数组指针
数组指针(Array Pointer):
数组指针是指向数组的指针,它指向数组的首地址。数组指针的声明需要指定所指向的数组类型,而不是数组的大小。
int a1[3] = {1, 2, 3};
int (*p)[3]; // 声明一个指向包含三个整数的数组的指针
p = &a1; // 将p指向数组a的首地址
或者更直观点,便于后文理解。
int a[][3] = { {1,2,3},{4,5,6} };
int(*p)[3]=a;
指针数组
指针数组(Pointer Array):
指针数组是一个数组,其元素都是指针类型。每个元素指向不同的内存位置,这些位置可以是相同类型的数据。在声明指针数组时,需要指定数组的大小和元素类型,然后每个元素都可以被赋值为指向相应数据类型的指针。
int a1[3] = {1,2,3};
int a2[3] = {3,2,1};
int a3[3] = {2,2,2};
//指针数组
int* b[3] = {a1,a2,a3};
C++创建二维数组
- 方法一 数组指针
int main() {
//使用的是数组指针的方法
int(*p)[3] = new int[3][3];
// 给二维数组赋值
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
p[i][j] = i * 3 + j + 1;
}
}
// 访问和输出二维数组的元素
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
cout << p[i][j] << " ";
}
cout << endl;
}
delete[] p;
return 1;
}
- 方法二 指针数组
int main(){
int rows = 2;
int cols = 3;
// 动态分配一个 2x3 的二维数组
int** p = new int*[rows];
for (int i = 0; i < rows; i++) {
p[i] = new int[cols];
}
// 给二维数组赋值
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
p[i][j] = i * 3 + j + 1;
}
}
// 访问和输出二维数组的元素
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
cout << p[i][j] << " ";
}
cout << endl;
}
delete[] p;
}
C语言创建二维数组
- 方法一 指针数组
int main() {
//创建2*3的二维数组。
int** a = (int**) malloc(sizeof(int*) * 2);
for (int i = 0; i < 2; i++)
{
a[i] = (int*)malloc(sizeof(int) * 3);
}
// 给二维数组赋值
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
a[i][j] = i * 3 + j + 1;
}
}
// 访问和输出二维数组的元素
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
cout << a[i][j] << " ";
}
cout << endl;
}
delete[] a;
return 1;
}
malloc(sizeof(int*) * 2) 是一个大小为2的指针数组,里面有两个位置{int*,int*}可以存放int指针类型的值。这里可能比较迷惑的是为什么用int** a来接收,其实a默认指向的是两个位置的第一个位置的地址,该位置 int* 其实可以理解为就是一个一维数组,那么该数组的地址就是指针的指针,所以可以使用int**的变量a来指向。a[0]、a[1]分别是第一行、第二行({int*,int*})的开始地址。a[0][1]就是第一个int*地址上下标为’1’的值。
要明白int**为什么能指向int*[2],看完以下代码可能就清晰了:
int main() {
//创建2*3的二维数组。
int x1[] = {1,2,3};
int x2[] = {4,5,6};
int* s[2] = {x1 ,x2 };
int** a = s;
cout <<a[0][0]<<" "<<a[0][1] <<" "<<a[0][2]<<endl;
cout <<a[1][0]<<" "<<a[1][1] <<" "<<a[1][2]<<endl;
return 1;
}
运行输出:
- 方法二 数组指针
int main(){
//数组指针a指向2*3的二维数组
int(*a)[3] = (int(*)[3])malloc(sizeof(int)*2*3);
// 给二维数组赋值
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
a[i][j] = i * 3 + j + 1;
}
}
// 访问和输出二维数组的元素
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
cout << a[i][j] << " ";
}
cout << endl;
delete[] a;
return 1;
}