不兼容的C指针
警告:来自不兼容指针类型[-Wincompatible指针类型]的分配不兼容的C指针,c,pointers,C,Pointers,警告:来自不兼容指针类型[-Wincompatible指针类型]的分配 #include <stdio.h> #include <string.h> int main() { char *p; char str[100]; p = &str; return 0; } 这个不兼容的指针类型是什么?我搜索了一个小时,但找不到任何涵盖概念部分的内容。 我在这里做错了什么,导致了这个警告?&str的char*[100]类型与char
#include <stdio.h>
#include <string.h>
int main() {
char *p;
char str[100];
p = &str;
return 0;
}
这个不兼容的指针类型是什么?我搜索了一个小时,但找不到任何涵盖概念部分的内容。
我在这里做错了什么,导致了这个警告?&str的char*[100]类型与char*类型不兼容。您需要的只是将str赋值给p,作为在表达式中使用时指向它的第一个元素的数组衰减指针,除非操作数为sizeof且一元运算符为&operator。&str的char*[100]类型与char*类型不兼容。您需要的只是将str赋值给p作为数组衰减,以在表达式中使用时指向它的第一个元素的指针,除非操作数为sizeof和一元运算符&operator。编译器需要指向char的指针,但试图将指针赋值给char[100]。这不一样: 有关更详细的讨论,请参见以下内容:
编译器需要指向char的指针,但试图将指针分配给char[100]。这不一样: 有关更详细的讨论,请参见以下内容: str类型为char[100] 因此,使用&-运算符获取它的地址,会得到字符[100]的地址,而不是字符的地址 如果您考虑指针算法是如何工作的,那么差异的相关性就会变得很明显: 将指针的值增加1,移动的字节数与类型使用指针指向的字节数相同。对于指向char[100]的指针,它是100,对于指向char的指针,它是1 要定义指向数组的指针,请使用有点不直观的表示法
T (*<name>)[<dimension>]
所以我们可以写:
char str[100];
char (*ps)[100] = &str; // make ps point to str
让ps指向数组str
做
使p指向str的第一个元素,即char
有趣的是p和ps指向同一个地址-
但如果你愿意
ps = ps + 1;
ps增加了100字节,而
p = p + 1;
p只增加了一个字节。str的类型是char[100]
因此,使用&-运算符获取它的地址,会得到字符[100]的地址,而不是字符的地址
如果您考虑指针算法是如何工作的,那么差异的相关性就会变得很明显:
将指针的值增加1,移动的字节数与类型使用指针指向的字节数相同。对于指向char[100]的指针,它是100,对于指向char的指针,它是1
要定义指向数组的指针,请使用有点不直观的表示法
T (*<name>)[<dimension>]
所以我们可以写:
char str[100];
char (*ps)[100] = &str; // make ps point to str
让ps指向数组str
做
使p指向str的第一个元素,即char
有趣的是p和ps指向同一个地址-
但如果你愿意
ps = ps + 1;
ps增加了100字节,而
p = p + 1;
p只增加了一个字节。Change p=&str;p=str;或p=&str[0];。您必须使用str的第一个地址分配p。str的第一个地址是&str[0]或str。更改p=&str;p=str;或p=&str[0];。您必须用str的第一个地址分配p。str的第一个地址是&str[0]或str。我对char*[100]和char*很困惑。您能给我推荐一个资源,让我了解这个主题吗。@剩下的是什么?char和char[100]不一样,所以指向它们的指针也不一样。@对于初学者来说,阅读非平凡的C类型说明符可能会让人困惑,特别是因为它们不包含变量或参数或任何东西的标识符。下面是一些类型说明符和匹配的变量声明:char:char x;单焦;char[100]:char x[100];100个字符的数组;char*:char*x;指向字符的指针;char*[100]:char*x[100];指向字符的100个指针数组;char*[100]:char*x[100];指向100字符数组的指针。我对char*[100]和char*很困惑。你能给我推荐一个资源,让我了解这个主题吗。@剩下的到底是什么让我困惑?char和char[100]不一样,所以指向它们的指针也不一样。@对于初学者来说,阅读非平凡的C类型说明符可能会让人困惑,特别是因为它们不包含变量或参数或任何东西的标识符。下面是一些类型说明符和匹配的变量声明:char:char x;单焦;char[100]:char x[100];100个字符的数组;char*:char*x;指向字符的指针;char*[100]:char*x[100];指向字符的100个指针数组;char*[100]:char*x[100];指向100个字符数组的指针。