2017-04-10 6 views
0

私は現在、Cを学ぶためにK & Rを使っています。ポインタと変数は同じように振る舞いますが、ポインタは変数であり、配列にはこの能力はありません。配列とポインタが異なる

私はこのことを理解しますが、次のコードは、私を少し混乱:

int len, nlines; 
char *p, line[MAXLINES]; /* Confusing part */ 

あなたはそれがポインタに崩壊関数に配列を渡すとき、私は知っているが、ここにあなたが文字ポインタを宣言することができますし、それらが異なっていても同じ行の文字配列たぶん私は自分自身を混乱させているかもしれませんが、これは私にとっては変です。ありがとう!

char *p; // Pointer 
char line[MAXLINES]; // Fixed-sized character array 

彼らは、その基本型とどこがソースコード内で宣言された以外の方法で関連していない。ただ、同じ行に複数の変数を宣言し、これに相当します

+3

ある彼ら場合は、1行に複数のものを宣言することができますですすべてが同じ "ルート"タイプを持っています。 'int w、x、y [5]、z(void);' 2つのint、int配列、およびintを返す関数を宣言します。宣言ごとに1つの識別子を優先して、この習慣を妨げる人もいます。 –

+0

pはcharへのポインタです。行は、charのMAXLINESのサイズの配列です。 –

+0

ここで混乱するのは、変数がルートタイプを「変更」できるということです。したがって、 'char a、* b、** c'は単一の文字' a'、文字 'b'へのポインタ、文字' c'へのポインタへのポインタを宣言します。同様に、配列は同様の宣言スタイルで使用されるときにルート型を '変更'します。結果的に、これは私が見た現代のC開発者のほとんどが、単一の宣言的な行ではなく[tadmanの答え](http://stackoverflow.com/a/43334568/510036)に示されている宣言スタイルを推奨する理由です。 – Qix

答えて

0

私が覚えていることは、実際にはこれを混乱させることはありません。その行を見ると、コード内の,*plines[MAXLINES]を分けています。したがって、ユーザーは2つの異なる変数を宣言しています。

あなたはこのように見ることができます:

char *p; //Pointer due to the asterik (*) 
char line[MAXLINES]; //Array because of [] 

同じことがint len, nlines;のために行きます。

int len; //First int var 
int nlines; //Second int var 

varを1行に書き込むだけで、きれいに見えます。それ以外は、両者に違いはありません。

-3

彼らはあなたがポインタを宣言し、配列

int *ptr,arr[10],value=5; 
ptr[0]=value; 
*(arr)=value; 

として使用することができます すべてに同じですが、違いは、配列は定数ポインタ

+2

これは間違っています、ポインタは配列ではなく、 'ptr'は何も指していません。' value'は初期化されていません。定義されていない動作を呼び出します。 – mch

+0

ああ、初期化されていないことは分かっていますが、それは数字であると仮定しています。 –

+0

'ptr'はまだ初期化されていないので、' ptr [0] 'は未定義の動作を呼び出します。また、配列とポインタは「すべて同じ」ではなく、配列は定数ポインタではありません。 – mch