我是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]将是数组的第一个元素。
这是我第一次看到这种指针,所以我真的不知道它是如何工作的。
如果这是一个愚蠢的问题,我道歉。
谢谢。
答案 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个short
个pas
点数组。然后,您可以像使用任何其他数组一样在此数组上使用下标运算符,请注意[]
的优先级高于*
,因此您需要使用括号:
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].