警告:從兼容的指針類型[-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