指向一组int的指针

有什么区别:

//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; 

和:

 int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *Parr = arr; 

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

在第一个代码示例中,

 int (*Parr)[10] = &arr; 

Parr是指向10个int的数组的指针。 它只能指向这样一个对象。 例如,

 int (*Parr)[10]; int a[10]; Parr = &a; // OK int b[42]; Parr = &b; // ERROR, b is of the wrong type 

在第二个代码示例中,

 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 [10]formsarr [0]。 但是在第二种情况下做parr ++。parr将移动到位置arr [1]formsarr [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]