int main()
{
char artist1[4][80] = {};
char artist2[4][80] = {};
char (*pb1)[4][80] = artist1;
char (*pb2)[4][80] = artist2;
char *arrptr[2] = {pb1, pb2};
}
我正在尝试将指针分配给二维数组,以便我可以根据指针对数组进行排序。我已经用整数数组完成了这个并且工作正常。为什么会出现此错误?
对于初学者来说,这些数组的初始值设定项
char artist1[4][80] = {};
char artist2[4][80] = {};
在 C23 标准之前的 C 中无效。你不能使用空括号。
你可以这样写
char artist1[4][80] = { 0 };
char artist2[4][80] = { 0 };
在此声明中
char (*pb1)[4][80] = artist1;
char (*pb2)[4][80] = artist2;
初始化表达式
artist1
和 artist2
具有 char ( * )[80]
类型,因为数组隐式转换为指向其第一个元素的指针,而初始化对象具有 char ( * )[4][80]
类型。所以编译器发出一条消息,因为这些指针类型的对象之间没有隐式转换。
你应该写任一个
char (*pb1)[4][80] = &artist1;
char (*pb2)[4][80] = &artist2;
或(最好)
char (*pb1)80] = artist1;
char (*pb2)[80] = artist2;
本声明
char *arrptr[2] = {pb1, pb2};
也是错的
如果你将像这样声明指针
char (*pb1)80] = artist1;
char (*pb2)[80] = artist2;
然后上面的声明看起来像
char ( *arrptr[2] )[80] = {pb1, pb2};
数组不是指针。要获取指向数组的指针,请使用“寻址”运算符
&
.
char (*pb1)[4][80] = &artist1;
char (*pb2)[4][80] = &artist2;
此外,
arrptr
的声明需要是一个指向二维数组的指针数组。
char (*arrptr[2])[4][80] = { pb1, pb2 };
声明可以被人解析为:
arrptr - arrptr is ...
arrptr[2] - ... 2-element array of ...
(*arrptr[2]) - ... pointers to ...
(*arrptr[2])[4] - ... 4-element array of ...
(*arrptr[2])[4][80] - ... 80-element array of ...
char (*arrptr[2])[4][80] - ... char