2017-08-17 55 views
0

警告:从兼容的指针类型[-Wincompatible指针类型]不兼容的C指针

#include <stdio.h> 
#include <string.h> 

int main() { 
    char *p; 
    char str[100]; 
    p = &str; 

    return 0; 
} 

这是什么不兼容的指针类型的事情分配?我正在寻找一小时,但找不到涵盖概念部分的任何内容。 我在这里做错了什么,导致这个警告?

+2

将'p = &str;'更改为'p = str;'或'p =&str [0];'。 – AntonH

+0

您必须为str指定p的第一个地址。 str的首地址是&str [0]或str。 – Ihdina

回答

4

&str类型char (*)[100]这是不符合类型char *。你需要的只是将str指定为p作为数组衰减指向它在表达式中使用时的第一个元素,除非操作数为sizeof和一元运算符&

+0

我对char(*)[100] vs char *'很迷惑,你能否给我一个资源建议,以便我可以了解这个主题。 –

+0

@LeftOver究竟是什么让人困惑? 'char'与'char [100]'不一样,所以指向那些的指针也不一样。 –

+0

@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的数组的指针)。 –

2

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

有趣的是,pps指向相同的地址。:-)

但是如果你会做

ps = ps + 1; 

ps得到了增加字节,而做

p = p + 1; 

p得到了增加只是一个字节时。