在将指针分配给二维数组时从不兼容的指针类型初始化

问题描述 投票:0回答:2
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};
    
}

我正在尝试将指针分配给二维数组,以便我可以根据指针对数组进行排序。我已经用整数数组完成了这个并且工作正常。为什么会出现此错误?

arrays c pointers multidimensional-array implicit-conversion
2个回答
2
投票

对于初学者来说,这些数组的初始值设定项

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};

2
投票

数组不是指针。要获取指向数组的指针,请使用“寻址”运算符

&
.

    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
© www.soinside.com 2019 - 2024. All rights reserved.