📜  int(* p)[3]和int * p [3]之间的区别?(1)

📅  最后修改于: 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]声明的指针是指向指针的数组,必须先把每个指针指向某个数组或变量才能使用。