不兼容的C指针

不兼容的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

警告:来自不兼容指针类型[-Wincompatible指针类型]的分配

#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个字符数组的指针。