📅  最后修改于: 2023-12-03 15:31:25.268000             🧑  作者: Mango
在C/C++中,声明一个数组指针有两种方式:int (* p)[3]
和int * p [3]
,他们的区别在于:
int (* p)[3]
是一个指向数组的指针,指向的是一个包含3个元素的int
类型数组。这个指针可以通过*p[i]
访问数组中的元素,其中i的取值范围是0~2。int * p [3]
是一个指向指针的数组,其中每个指针都可以指向一个int
类型的变量或数组的首元素。这个二维数组中第一维的大小是3,可以通过p[i][j]
来访问第i个指针指向的数组中的第j个元素。下面举例说明它们之间的区别,假设我们定义了一个包含3个元素的一维数组arr
,每个元素的值为1、2和3,代码如下:
int arr[3] = {1, 2, 3};
我们再定义一个包含3个元素的二维数组arr2
,其中每个元素都是一个一维数组,代码如下:
int arr2[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
接下来,我们定义一个名为p
的指针变量,并将其分别指向上述两个数组。
int (* p)[3]
int (* p)[3];
p = &arr; // p指向一维数组arr
for(int i=0; i<3; i++)
{
std::cout << *(*p+i) << " "; // 输出1 2 3
}
std::cout << std::endl;
p = arr2; // p指向二维数组arr2
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
std::cout << *(*(p+i)+j) << " "; // 输出1 2 3 4 5 6 7 8 9
}
}
std::cout << std::endl;
int * p [3]
int * p [3];
p[0] = arr; // p[0]指向一维数组arr
p[1] = &arr[1]; // p[1]指向arr[1]
p[2] = arr2[2]; // p[2]指向二维数组arr2的第3行
for(int i=0; i<3; i++)
{
std::cout << p[i][0] << " "; // 输出1 2 7
}
std::cout << std::endl;
p[0] = arr2[0]; // p[0]指向二维数组arr2的第1行
for(int i=0; i<3; i++)
{
std::cout << p[0][i] << " "; // 输出1 2 3
}
std::cout << std::endl;
从上述例子可以看出,int (* p)[3]
声明的指针可以直接指向一维或二维数组,因为它是指向数组的指针,而int * p [3]
声明的指针是指向指针的数组,必须先把每个指针指向某个数组或变量才能使用。