15
char *p = "some string"   

文字列を含むブロックを指すポインタ p を作成します。

char p[] = "some string" 

リテラルを含む文字配列を作成します。

そして1つ目は定数宣言です。2次元配列も同じですか?

違いは何ですか

char **p,char *p[],char p[][]. 

これについて少し読んだところ、 char **p はポインターの配列を作成するためchar p[][]、ポインター値を格納する場合と比較してオーバーヘッドが発生します。

argv最初の 2 つの宣言は、定数配列を作成します。 inの内容を変更しようとしたときに実行時エラーは発生しませんでしたmain(int argc,char **argv)。関数プロトタイプで宣言されているためですか?

4

3 に答える 3

6

次のように、メモリアドレッシングビューから見たいくつかの違いについて説明します。

I.char **p; pは double 型のポインタですchar

宣言:

char a = 'g';
char *b = &a;
char **p = &b;


   p                    b                    a     
+------+             +------+             +------+
|      |             |      |             |      |              
|0x2000|------------>|0x1000|------------>|   g  | 
|      |             |      |             |      |
+------+             +------+             +------+
 0x3000               0x2000               0x1000
Figure 1: Typical memory layout assumption   

上記の宣言でachar、文字を含む型gです。ポインタbには、既存の文字変数のアドレスが含まれますa。今bは住所0x1000で、*b文字gです。最後に のアドレスbが に代入されるpため、aは文字変数、bはポインター、pはポインターへのポインターです。以下の図に示すように、a値をb含み、アドレスを含み、アドレスのアドレスを含むことを意味します。p

ここではsizeof(p) = sizeof(char *)、それぞれのシステムで;

Ⅱ.char *p[M]; p文字列の配列です

宣言:

char *p[] = {"Monday", "Tuesday", "Wednesday"};


      p
   +------+  
   | p[0] |       +----------+
0  | 0x100|------>| Monday\0 |              
   |      |       +----------+
   |------|       0x100
   | p[1] |       +-----------+
1  | 0x200|------>| Tuesday\0 |
   |      |       +-----------+
   |------|       0x200
   | p[2] |       +-------------+
2  | 0x300|------>| Wednesday\0 |
   |      |       +-------------+ 
   +------+       0x300
Figure 2: Typical memory layout assumption

この宣言でpは、 型の 3 つのポインターの配列ですchar。配列pが 3 つの文字列を保持できることを意味します。各文字列(Monday, Tuesday & Wednesday)はメモリ内のどこかにあり、(0x100, 0x200 & 0x300)アドレスはそれぞれ配列にありpます(p[0], p[1] & p[2])。したがって、それはポインターの配列です。

ノート:char *p[3];

1. p[0], p[1] & p[2] are addresses of strings of type `char *`.
2. p, p+1 & p+2 are address of address with type being `char **`.
3. Accessing elements is through, p[i][j] is char; p[i] is char *; & p is char **

ここsizeof(p) = Number of char array * sizeof(char *)

III. char p[M][N]; p次の次元の固定長文字列の配列です。M x N

宣言:

char p[][10] = {Monday, Tuesday, Wednesday};


  p  0x1 2 3 4 5 6 7  8  9  10
    +-------------------------+
 0  | M  o n d a y \0 \0 \0 \0|     
 1  | T  u e s d a  y \0 \0 \0| 
 2  | W  e d n e s  d  a  y \0|
    +-------------------------+
 Figure 3: Typical memory layout assumption

この場合、配列pにはそれぞれ 10 文字を含む 3 つの文字列が含まれます。メモリ レイアウトからはp、 size の文字の 2 次元配列であると言えます。MxNこれは3x10、この例にあります。char *p[]これは、文字列の長さが指定されていないためメモリの浪費がなく、長さが等しくない文字列を表すのに役立つ 宣言と比較して、文字列に含まれる文字が 10 文字未満の場合にメモリが浪費される可能性があるため、等しい長さの文字列を表すのに役立ちます。

要素へのアクセスは上記の場合と同様で、p[M]M 番目の文字列 & p[M][N] は M 番目の文字列の N 番目の文字です。ここsizeof(p) = (M rows * N columns) * sizeof(char)では2次元配列です。

于 2013-11-04T08:35:58.463 に答える
0
  • ainchar* aは、文字の配列へのポインターであり、a変更できます。
  • binchar b[]は文字の配列です。 b変更できません。

それらは一種の互換性があります- 割り当てと式でb自動的に減衰できますがaその逆はできません。

を使用するとchar** p、非常によく似た状況になりますが、間接的なレベルが増えるだけです。char* p[]char p[][]

于 2013-10-11T18:58:54.847 に答える