警告:从兼容的指针类型[-Wincompatible指针类型]不兼容的C指针
#include <stdio.h>
#include <string.h>
int main() {
char *p;
char str[100];
p = &str;
return 0;
}
这是什么不兼容的指针类型的事情分配?我正在寻找一小时,但找不到涵盖概念部分的任何内容。 我在这里做错了什么,导致这个警告?
警告:从兼容的指针类型[-Wincompatible指针类型]不兼容的C指针
#include <stdio.h>
#include <string.h>
int main() {
char *p;
char str[100];
p = &str;
return 0;
}
这是什么不兼容的指针类型的事情分配?我正在寻找一小时,但找不到涵盖概念部分的任何内容。 我在这里做错了什么,导致这个警告?
编译器期望指向char
的指针,但试图将指针指定为char[100]
。那是不一样的:)
进行更详细的讨论,请参阅以下:
&str
类型char (*)[100]
这是不符合类型char *
。你需要的只是将str
指定为p
作为数组衰减指向它在表达式中使用时的第一个元素,除非操作数为sizeof
和一元运算符&
。
我对char(*)[100] vs char *'很迷惑,你能否给我一个资源建议,以便我可以了解这个主题。 –
@LeftOver究竟是什么让人困惑? 'char'与'char [100]'不一样,所以指向那些的指针也不一样。 –
@LeftOver阅读非平凡的C类型说明符可能会让初学者感到困惑,尤其是因为它们不包含变量(或参数或其他)的标识符。这里有一些类型说明符和匹配的变量声明:'char':'char x;'(单个'char'); 'char [100]':'char x [100];'(100'char数组); 'char *':'char * x;'(指向'char'的指针); 'char * [100]':'char * x [100];'(指向'char'的100个指针的数组); 'char(*)[100]':'char(* x)[100];'(指向100个char的数组的指针)。 –
str
键入char[100]
。
因此,通过使用&
-operator获取地址,可为您提供地址char[100]
,而不是地址char
。如果你认为在指针算法如何工作
的差异的意义是显而易见的:
递增1指针移动的字节数的类型使用指针指向它的价值。对于指向char[100]
的指针是100,对于指向char
的指针只有1。
要定义一个指针阵列中的多少有些不直观的符号
T (*<name>)[<dimension>]
被使用。
因此,一个指针到char[100]
将是
char (*ps)[100];
所以可以写成:
char str[100];
char (*ps)[100] = &str; // make ps point to str
有ps
指向阵列str
。
否则
char * p = str;
使得p
指向的str
的第一元件,这是一个char
。
有趣的是,p
和ps
指向相同的地址。:-)
但是如果你会做
ps = ps + 1;
ps
得到了增加字节,而做
p = p + 1;
p
得到了增加只是一个字节时。
将'p = &str;'更改为'p = str;'或'p =&str [0];'。 – AntonH
您必须为str指定p的第一个地址。 str的首地址是&str [0]或str。 – Ihdina