无法理解指向固定大小数组的指针

时间:2014-08-07 03:44:47

标签: c++ arrays pointers

我是C ++的新手,无法弄清楚指向固定大小数组的指针是如何工作的。

我正在读的这本书说:

short tell[10];
short (*pas)[20] = &tell;  //pas points to array of 20 shorts

...Thus, the type of pas is short(*)[20]. Also note that because pas is set to
&tell, *pas is equivalent to tell, so (*pas) [0] would be the first element of the array.

我没有得到的是,“如果pas,设置为& tell,* pas相当于tell。所以,(* pas)[0]将是数组的第一个元素。 “

我不明白如果将pas设置为&amp; tell,这是一个20字节的内存块的地址, * pas 相当于 tell < / strong>即可。这意味着(* pas)[0]将是数组的第一个元素。

这是我第一次看到这种指针,所以我真的不知道它是如何工作的。

如果这是一个愚蠢的问题,我道歉。

谢谢。

1 个答案:

答案 0 :(得分:3)

数组是C ++中的一种对象,因此您可以拥有指向数组的指针或数组引用。数组的名称将衰减指向许多上下文中第一个元素的指针,但不是只是指向其第一个元素的指针。例如,给定int a[10]; int* i;,则sizeof(a)sizeof(int) * 10,几乎可以肯定 等于sizeof(i)

声明指向数组的指针的语法是你书中显示的丑陋的语法:

 short (*pas)[20]; // declare pas as a pointer to an array of 20 shorts
                   // pas is a single pointer

完全

不同
 short *foo[20];   // declare foo as an array of 20 pointers to short
                   // foo is an array containing 20 pointers

您可以获取数组的地址并将其指定给指向数组的指针,就像您可以获取int变量的地址并将其存储在指向int的指针中一样:

 short stuff[20];
 pas = &stuff;      // pas now points to the array stuff

您可以编写一个通过引用获取数组的函数:

 void f(short (&arr)[20]) { } // f takes an array of 20 shorts by reference

 short p[20];
 short *i = p;   // p decays to a pointer to its first element in this context,
                 // and the resulting pointer is used to initialize i
 f(p);           // ok, pass the array by reference
 f(i);           // compile error

现在,示例中的代码是

short tell[10];
short (*pas)[20] = &tell;  //pas points to array of 20 shorts

无法编译,因为&tell的类型是&#34;指向10 short s&#34;数组的指针,无法将其分配给&#type类型的变量34;指向20 short s&#34;。

的数组的指针

假设我们修复了这段代码:

short tell[20];
short (*pas)[20] = &tell;  // now compiles! yay!

然后pas是一个指向20 short s数组的指针,它指向数组tell。取消引用指向T&#34;的指针为您提供指针所指向的T,因此使用pas取消引用*pas会为您提供20个shortpas点数组。然后,您可以像使用任何其他数组一样在此数组上使用下标运算符,请注意[]的优先级高于*,因此您需要使用括号:

short c = (*pas)[0];   // initializes c with the first element of the array pas points to
                       // since pas points to tell, this initializes c with tell[0].