C:不兼容的指针类型初始化

时间:2015-04-19 20:39:04

标签: c arrays pointers

我正在尝试学习C.我目前正在使用指针,因此我决定编写一些代码来了解它是如何工作的。但是代码按预期工作(即它在数组中添加字符a-j并将其打印在控制台上)但我收到有关不兼容指针赋值的警告。我已经添加了警告,因为警告是在线上发表的。

#include <stdio.h>
#include <stdlib.h>


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

    #define MAX 10

    char* c[MAX]; // pointer to the 1st element in the array
    char* pointer = &c; // Warning: Incompatible pointer types initializing 'char *' with an expression of type 'char *(*)[10]'
    for (int j = 0; j < 10; j++)
    {
        *pointer = 'a' + j;
        pointer++;
    }

    pointer = &c; // Warning: Incompatible pointer types assigning to 'char *' from 'char *(*)[10]'
    for (int j = 0; j < 10; ++j)
    {
        printf("i[%d] = %c\n", j, *pointer);
        ++pointer;
    }

    return 0;
}

有人可以解释为什么我会收到这些警告吗?

char* pointer = &c; & pointer = &c;

我理解我写的代码如下所示,声明一个名为pointer的char指针,并将数组中第一个元素的地址指定给指针。

PS!请不要评论如何用更好的代码来实现相同的结果,因为我试图在这里学习指针和数组。虽然这可能是实现这一结果的冗长方式,但我觉得它在语法上是正确的,所以如果我弄错了,请帮助我理解。

3 个答案:

答案 0 :(得分:3)

c是指向char的指针数组:

char* c[MAX];

此表达式的类型

&c

是&#34;指向MAX&#34;或

的长度 - char指针数组的指针
char *(*)[MAX]

编译器警告您,您正在从另一种类型中初始化一种类型的指针。

目前还不清楚您打算如何处理代码,但是char*的有效初始化没有转化

char* pointer = c[0];

&c(指向指针数组的指针)的有效初始化将是

char *(*pointer)[MAX] = &c;

或者,您可以让数组&#34;衰变&#34;通过省略address-of运算符&&#34;来指向其第一个元素的指针,但这会产生一个指向指针的指针:

char** pointer = c;

答案 1 :(得分:2)

从代码中你似乎以错误的方式声明了数组,它应该是

char c[MAX];

这是char的数组,而不是char指针的数组,然后

char *pointer;
pointer = c;

其中pointer 指向c 的第一个元素的指针,其余代码将按预期工作。< / p>

另外,我有点好奇为什么你在MAX内定义了main()宏,以防万一你不知道,它没有被宣布为&#39} ;在编译之前由preropcessor替换,所以你把它放在代码中是完全不相关的。

答案 2 :(得分:1)

变化:

char* pointer = &c

char* pointer = c[0];

c元素类型为char *,但&c类型是指向c类型的指针。

编辑:这会修复你的警告,但问题是你是在先处理错误的类型。

而不是:

char* c[MAX];
char* pointer = &c;

使用:

char c[MAX];
char *pointer = c;

在您的程序中,您要存储字符,因此您需要一个char数组,而不是char *元素数组。

pointer = &c;相同,然后必须为pointer = c;