好吧所以我遇到了这个指针类型,我试图在我的代码中使用它,但我从编译器得到一个警告说它在不兼容的指针类型
这是类型
data_type (*i)[j]
,i
是变量名称
并且j
是指针的大小
例如,如果您希望指针的大小为4个整数,则需要声明
int (*i)[4]
然后你需要分配一个4个整数的数组
i = &s[4]
然而,当我尝试分配它时,我收到来自编译器的警告incompatible type
所以这里的问题似乎是什么?以及如何正确使用它?
答案 0 :(得分:6)
cdecl.org告诉我们它是:
int (*i)[4]
声明我是指向int
的数组4的指针
所以,我们可以像这样使用它:
int arr[4];
int (*i)[4] = &arr;
或者,堆分配内存:
int (*j)[4] = malloc(sizeof(int[4]));
答案 1 :(得分:3)
int (*i)[4];
声明i
是指向4
int
数组的指针。您说s
是4
int
int s[4];
作业
i = &s[4];
是错误的,因为&s[4]
是刚刚通过数组的内存块的地址,类型为int *
。通常,数组会衰减成指向其第一个元素的指针,但是作为一元&
运算符的操作数,它不会衰减,因此&s
会给出数组s
的地址。类型为int (*)[4]
。
i = &s;
答案 2 :(得分:1)
如果j
是可变的,那么我建议改为使用std::vector
并引用容器而不是指针:
std::vector<int> i(j);
auto& i_ref = i;
如果j
是一个常量表达式,我仍然避免使用C风格的数组并改为使用std::array
,并且仍然只使用引用:
constexpr std::size_t j = 4;
std::array<int, j> i;
auto& i_ref = i;
答案 3 :(得分:0)
这个
int s[4];
将s
声明为4
int
的数组。
使用表达式s[4]
(在定义s
之后)将评估为s
的第5个元素(int
)。
由于s
只有4
元素,所以这样做是非法的&#34;并引发程序未定义的行为。
所以要将int(*i)[4]
的地址分配给s
:
i = &s;
如果使用C99或更高版本初始化i
而未声明s
,您可能也会这样做:
i = &(int[4]){0};