2017-08-17 27 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

pにstrの最初のアドレスを割り当てる必要があります。 strの最初のアドレスは&str [0]またはstrです。 – Ihdina

答えて

4

&strchar (*)[100]のタイプchar *と互換性がありません。以外の式で使用された場合どのようなあなたはそれへのポインタを配列減衰としてpstrを割り当てている必要がありますすることは、第1の要素だときsizeofのオペランドと単項演算子&

+0

私は 'char(*)[100] vs char * 'と非常に混同しています。私はこの主題について学ぶことができるように私にリソースを提案できますか? –

+0

@LeftOver正確に何が混乱していますか? 'char'は' char [100] 'と同じではないので、それらへのポインタも同じではありません。 –

+0

@LeftOver特に、変数(またはパラメータなど)の識別子が含まれていないため、Cの型指定子が初心者にとって分かりにくい場合があります。いくつかの型指定子と一致する変数宣言があります: 'char':' char x; '(single' 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

strchar[100]入力されます。

&オペレーターを使用してアドレスを取得すると、charのアドレスではなく、char[100]のアドレスが与えられます。

1でポインタをインクリメント型はポインタのポイントを使用してできるだけ多くのバイトとしての価値を動かす:あなたはポインタ演算がどのように機能するかに思われる場合は差額の

関連性が明らかになりました。どのchar[100]へのポインタ100とcharへのポインタのためのちょうど1です。


幾分直感的表記

T (*<name>)[<dimension>] 

が使用されている配列へのポインタを定義します。

のでchar[100]へのポインタで、その1を書くことができます

char (*ps)[100]; 

次のようになります。

char str[100]; 
char (*ps)[100] = &str; // make ps point to str 

str配列にpsポイントを持っています。

char * p = str; 

を行う

charあるstrの第一要素にpポイントになります。

興味深いのは、同じアドレスにそのppsポイントです。:-)

しかし、あなたがしたい場合

p = p + 1; 

pをするときだけバイトをインクリメントしまったのに対し、

ps = ps + 1; 

psは、バイトをインクリメントました。

関連する問題