【C/C++】char * ,char ** ,char a[ ] ,char *a[]

1201 ワード

1.配列の本質:
配列は複数の要素の集合であり、メモリにはアドレスが接続されたユニットに分布するので、その下付き文字で異なるユニットの要素にアクセスできます.
2.ポインタ
ポインタも変数ですが、メモリユニットには他の場所を識別するアドレスが保存されています.
3.文字列定数の本質は、その最初の文字のアドレスです.(配列と同様に、配列名も最初の要素のアドレスです).
char  *s ;

s = "mgchen";   //                       ??

    ,                   。

4.char*とchar a[]
   char  *s;

   char  a[ ] ;

aは文字列のヘッダアドレスを表し、sというポインタも文字列のアドレス(実はヘッダアドレス)を保存する.
したがって、次のような値を割り当てることができます.
s = a;// a     s,s   ,  a   ,     a ,               ,     a       s

//aの値をs,sをポインタとし,aは配列であるが,aを用いる場合,コンパイラはそれを配列ヘッダ要素のアドレスと見なすので,aの値をポインタsに割り当てることができる.
注意:sizeof()配列名は、sizeof()ポインタの結果とはまったく異なります.
char a[10];
char *s  ;

sizeof(a)     10  (10   *1   )
sizeof(s)     4.   (1    4   )

しかし、配列名がパラメータとして関数に渡されると、配列名がポインタに劣化し、sizeof()配列名はsizeof()ポインタの結果と同じになります.
 
5.char**とchar*a[]
char*a[]は配列を表し、配列内の要素こそchar*(すなわち、要素はcharタイプを指すポインタ)である.
char**sは2次ポインタであり、sには1次ポインタchar*のアドレスが保存されている.このようにchar*(*s)を理解することができて、私はポインタsを定義しますが、私のポインタsは伝統的な変数のアドレスではなく、char*ポインタのアドレスを保存しています.(charをaと理解し、char*をbと理解し、char**をcと理解すると、bの値はaのアドレスであるが、cの値はbのアドレスである)