2017-08-17 54 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得到了增加只是一個字節時。