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