警告:从不兼容的指针类型 const int (*)[3] 赋值给 int **

时间:2021-07-17 09:53:22

标签: c pointers

我在将矩阵的指针分配给双指针时遇到问题,接下来会用到,如下:

const int COLOR_MAP_INDIA[16][3] = {{ 140, 67, 46 },{ 0, 0, 255 },{ 255, 100, 0 },{ 0, 255, 123 },{ 164, 75, 155 },{ 101, 174, 255 },{ 118, 254, 172 },{ 60, 91, 112 },{ 255, 255, 0 },{ 255, 255, 125 },{ 255, 0, 255 },{ 100, 0, 255 },{ 0, 172, 254 },{ 0, 255, 0 },{ 171, 175, 80 },{ 101, 193, 60 }};

int main(int argc, char *argv[]){
    int **COLOR_MAP;

    COLOR_MAP= COLOR_MAP_INDIA;
}

编译器说:

<块引用>

警告:从不兼容的指针类型 const int 赋值给 int ** (*)[3]

怎么了?

3 个答案:

答案 0 :(得分:1)

COLOR_MAP 被定义为指向 int 的指针,而 COLOR_MAP_INDIA 是由 3 个 int 组成的 16 个数组。这些类型不兼容。您应该将 COLOR_MAP 定义为指向 3 个 int 数组的指针:

int (*COLOR_MAP)[3] = COLOR_MAP_INDIA;

这个指针是否适合您的需要取决于您打算在代码的未发布部分做什么。

答案 1 :(得分:1)

即使只通过 COLOR_MAP 读取也会出现分段错误。

它被定义为包含指针(指向值),而不是三行的值。

其中 COLOR_MAP 的值为 140, 67,,它需要第一行的地址。

可以使用警告指示的抽象类型:

int (*COLOR_MAP)[3];
COLOR_MAP= COLOR_MAP_INDIA;
printf("%d\n", COLOR_MAP[2][1]);

const 不匹配是相同的,只是不那么引人注目。


指针数组版本

一个额外的指针层可用于为这些 RGB 三元组又名颜色命名:

int orange[] = {140,67,46};
int blue[] = {0,0,255};
int greenblue[] = {0,255,123};
int purple[] = {200,0, 200};

int *INDIA[] = {orange, greenblue, blue, purple};
int *INDIA_2[] = {greenblue, orange, purple, blue};

int main(int argc, char *argv[]){

    int **MAP;

    MAP = INDIA;
    printf("%d\n", MAP[1][2]);   // 123 
    MAP = INDIA_2;
    printf("%d\n", MAP[1][2]);   // 46
}

完全不同的方法,但元素的访问方式与二维数组 MAP[1][2] 相同。

答案 2 :(得分:1)

警告:从不兼容的指针类型 const int (*)[3] 赋值给 int **

您的编译器几乎会告诉您所有错误的地方。您需要知道的是,指向指针的指针(在您的情况下为 COLOR_MAP)不等于指向 3 个整数的一维数组(在本例中为 COLOR_MAP_INDIA)的指针。 本质上,您可能想考虑当它们都是指针时有什么区别。 但是当您尝试使用指针算法访问该指针周围的元素时,就会出现差异。

当你写作时:

COLOR_MAP_INDIA

你的意思是它是一个指向包含3个整数的一维数组的指针({140,67,46}的内存地址,实际上就是140的地址)。所以,当你做类似的事情时,

COLOR_MAP_INDIA + 1

您现在将指向下一个由 3 个整数组成的一维数组({0, 0, 255 } 的内存地址,在本例中为第一个 0)并且 NOT 中的第二个元素第一个数组。

指针是强类型的,因为您可以对它们执行指针算术,并且每个这样的算术不一定意味着加/减 1。

相关问题