我在理解C / C ++语法时遇到以下问题。假设我们有以下数据:
int a[3] = {1,3,5};
int b[3] = {2,4,6};
int* p[2];
我创建了一个包含两个指针的数组p
。
第一个问题:为什么以下分配不起作用:
p[0] = &a; p[1] = &b;
由于指针将地址作为其值。由于某些原因,p[0] = a; p[1] = b;
可以工作。
第二个问题:由于p [0]现在指向a
,所以*(*(p[0]))[0]
为什么不起作用?如何从某个索引处引用a的指针中获取值?
Background:我遇到了这些问题,因为我试图将标量的语法自然地扩展到数组,在其中可以使用以下语法:
double a = 3;
double* p = &a;
和* p给出值,而p给出地址。
在C ++中,它不会编译,因此是不允许的。
在C中,您将int(*)[3]
设置为int*
,p[0][i]
将起作用。
第一个问题:以下作业为什么不起作用:
p[0] = &a; p[1] = &b;
您使用指针数组中的int*
变量,您希望它存储什么?整个数组或特定元素的地址?当然,一个奇异值,只能将其p[index]
分配给单个变量,例如您的情况下的a[index]
。例如,这可以工作:
p[0] = &a[0];
// cout<<*p[0]; would yield a[0] or 1.
第二个问题:既然p [0]现在指向a,那么
*(*(p[0]))[0]
为什么不起作用?如何从某个索引处引用a的指针中获取值?
一次又一次地引用和取消引用指针(两次*
)。使用p[0][index]
引用所需索引处的a
。
有不同类型的指针。 &a
是指向3个int
的数组的指针。 p[0]
是指向单个int
的指针。它们不兼容。同时,数组可以衰减为指向第一个元素的指针,因此p[0] = a
使p[0]
指向a
的第一个元素。您可以通过使用与a
等效的*(p[0] + i)
将指针的偏移量应用于第一个元素来访问p[0][i]
中的元素。