C++ 指向整数数组的指针

C++ 指向整数数组的指针,c++,c,arrays,pointers,C++,C,Arrays,Pointers,以下两者之间的区别是什么: //Example of "Complicated Array Declarations" from C++ Primer int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int (*Parr)[10] = &arr; 以及: 两者都是指向整数数组的指针。但是为了访问第一个代码片段中arr的第一个元素,我必须执行**Parr,而在第二个代码片段中,我只需在第一个代码示例中取消引用一次*Parr int (*Parr)[10] =

以下两者之间的区别是什么:

//Example of "Complicated Array Declarations" from C++ Primer
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int (*Parr)[10] = &arr;
以及:


两者都是指向整数数组的指针。但是为了访问第一个代码片段中
arr
的第一个元素,我必须执行
**Parr
,而在第二个代码片段中,我只需在第一个代码示例中取消引用一次
*Parr

int (*Parr)[10] = &arr;
int *Parr = arr;
Parr
是指向10整数数组的指针。它只能指向这样一个对象。比如说,

int (*Parr)[10];
int a[10];
Parr = &a; // OK
int b[42];
Parr = &b; // ERROR, b is of the wrong type
在第二个代码示例中

int (*Parr)[10] = &arr;
int *Parr = arr;
Parr
是指向
int
的指针,初始化为指向
arr
的第一个元素。但它可以指向任何
int

int* Parr;
int a[10];
Parr = &a; // OK, a decays to int*
int b[42];
Parr = &b; // OK, b decays to int*
int c = 42;
Parr = &c; // OK, c is an int*

在第一个代码示例中

int (*Parr)[10] = &arr;
int *Parr = arr;
Parr
是指向10整数数组的指针。它只能指向这样一个对象。比如说,

int (*Parr)[10];
int a[10];
Parr = &a; // OK
int b[42];
Parr = &b; // ERROR, b is of the wrong type
在第二个代码示例中

int (*Parr)[10] = &arr;
int *Parr = arr;
Parr
是指向
int
的指针,初始化为指向
arr
的第一个元素。但它可以指向任何
int

int* Parr;
int a[10];
Parr = &a; // OK, a decays to int*
int b[42];
Parr = &b; // OK, b decays to int*
int c = 42;
Parr = &c; // OK, c is an int*

我们可以有一个指向整数的指针,或者一个指向foat的指针,我们也可以有一个指向数组的指针吗? 答案是“是”。然而,声明指向数组的指针有点笨拙

例如,声明int(*q)[4] 表示q是指向4整数数组的指针。在代码中

int(*parr)[10]表示parr是指向10整数数组的指针

但是int*parr=arr只是指向arr[10]的oth元素的指针

所以假设你有一个指向arr[10]的指针。 在第二种情况下,执行parr++。parr将从arr[0]移动到位置arr[10]。 但是 在第二种情况下,执行parr++。parr将从arr[0]移动到位置arr[1]


所以我希望你能得到答案。

我们可以有一个指向整数的指针,或者一个指向foat的指针,我们也可以有一个指向数组的指针吗? 答案是“是”。然而,声明指向数组的指针有点笨拙

例如,声明int(*q)[4] 表示q是指向4整数数组的指针。在代码中

int(*parr)[10]表示parr是指向10整数数组的指针

但是int*parr=arr只是指向arr[10]的oth元素的指针

所以假设你有一个指向arr[10]的指针。 在第二种情况下,执行parr++。parr将从arr[0]移动到位置arr[10]。 但是 在第二种情况下,执行parr++。parr将从arr[0]移动到位置arr[1]


所以我希望你能得到答案。

第一个是“指向int[10]的指针”

int (*Parr)[10] = &arr;  // point to int array

*Parr;   // *Parr == arr 
**Parr;  // **Parr == *(arr) == arr[0]
第二个是“指向int的指针”

int *Parr = arr;         // point to the start of array
*Parr;   // *Parr == *(arr) == arr[0]

第一个是“指向int[10]的指针”

int (*Parr)[10] = &arr;  // point to int array

*Parr;   // *Parr == arr 
**Parr;  // **Parr == *(arr) == arr[0]
第二个是“指向int的指针”

int *Parr = arr;         // point to the start of array
*Parr;   // *Parr == *(arr) == arr[0]

你能解释一下为什么我需要两次取消对Parr的引用吗?@EngieOP它是指向数组的指针。因此,您需要一个反引用来访问它所指向的数组,另一个反引用来访问元素。你也可以做
(*Parr)[3]
。好的,现在这更有意义了。谢谢。你也可以考虑int(*PARR)[10 ]是一个指向[[] ] [1]整数2D矩阵的第一行的指针。Parr[0]将指向第一行,Parr[1]将指向第二行,若要索引矩阵中的特定整数,可以使用Parr[row][column]。请解释一下为什么需要取消对Parr的引用两次?@EngieOP它是指向数组的指针。因此,您需要一个反引用来访问它所指向的数组,另一个反引用来访问元素。你也可以做
(*Parr)[3]
。好的,现在这更有意义了。谢谢。你也可以考虑int(*PARR)[10 ]是一个指向[[] ] [1]整数2D矩阵的第一行的指针。Parr[0]将指向第一行,Parr[1]将指向第二行,若要索引矩阵中的特定整数,可以使用Parr[row][column]。不,第二行不是指向数组的指针。它是指向数组第一个元素的指针。不,第二个不是指向数组的指针。它是指向数组第一个元素的指针。