有什么区别:
//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
答案 0 :(得分:6)
在第一个代码示例中,
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*
答案 1 :(得分:1)
我们可以有一个指向整数或指向foat的指针的方式,我们还可以有一个指向数组的指针吗? 答案是"是"。指向数组的指针的声明,但是有点笨拙。
例如,声明int(* q)[4] 表示q是指向4整数数组的指针。在您的代码中
int(* parr)[10]表示parr是一个指向10整数数组的指针。
但是int * parr = arr只是指向arr [10]的oth元素的指针。
所以假设你指向arr [10]的任何指针。 在第二种情况下做parr ++。parr将移动到位置arr [10]形式arr [0]。 但 在第二种情况下做parr ++。parr将移动到位置arr [1]形式arr [0]。
所以我希望你能得到答案。
答案 2 :(得分: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]