11612


C++初心者です。  
今までJava主体だったので、参照関係の知識は最低限(プリミティブかそうでないか)程度の認識しかありませんでした。  
PHPも少し触っていたので参照はわかりますが、ポインタがどうも理解しきれません。

参照 = 変数のアドレス  
ポインタ = 変数のアドレスの値、つまり参照の値ということでいいんでしょうか？

また、上と仮定した時、ダブルポインタが配列になる意味が納得できません。  
listとか、vectorのポインタはどうなるんですか？  
char **argv がcharの連想配列、  
char *argv[]がchar配列の配列 = stringの配列  
となるのであれば、  
list *arrayは「string型リスト」の配列にはなりませんよね？  
charはプリミティブだから扱いが違うという話なんでしょうか？


CC BY-SA 3.0
2015-06-22T09:50:01.920
11609
2017-07-25T01:37:46.397
2017-07-25T01:37:46.397
76
8396
question
c++ ポインタ
ポインタについて


`char *argv[]` は、`char *` の配列を意味します（関数の引数の場合実際はポインタ(`char**argv`)）。「char
配列の配列」ではありません。  
`char **argv` は、`char *` へのポインタを意味します。「charの連想配列」ではありません。  
`argv`が`char *`の配列の最初を要素を指している時、  
配列のそれぞれの要素（つまりchar へのポインタ）を`argv[インデックス]`でアクセスできるという意味で同じです。

ポインタは単純に最初の要素を指していて`[ ]`演算によって配列と同じようにアクセスできます。  
もちろんその場合要素は並びになっている必要があります。


CC BY-SA 3.0
2015-06-22T10:03:43.343
11612
2015-06-22T10:03:43.343
5044
11609
answer


ポインタは、アドレスを入れるための「変数」です。  
参照は、ある変数の別名（エイリアス）と考えるとわかりやすいです。  
ダブルポインタ(foo_t**)とは、ポインタ変数のアドレスを入れるための変数です。

char**は、char*型の変数のアドレスを格納するための変数です。

char* argv[]は、char*型の変数の配列です。

ポインタ変数で配列を保持できることを思い出すと、両者が同じように使えることが理解できます。  
（この使い方では同じ用に使えますが、実際のメモリ上にどのようにデータが置かれるかを考えると、まったく異なるものであることも理解できるでしょう）

list* array; は、list型変数のアドレスを入れるための変数です。  
なので、list型配列を宣言して、この変数に代入すると配列であるかのように扱えます。

[code]

    list* array;
    list array_body[10];
    array = array_body;
    array[5] = xxx; // array_body[5]に対する操作と等価
    
[/code]

なお、char* argv[]; と char *argv[]; は単に流儀の違いですので同じ意味です。


CC BY-SA 3.0
2015-06-24T07:56:33.030
11673
2015-06-24T07:56:33.030
10272
11609
answer


C言語は厳密な意味では文字列型はありません。  
char型の配列を文字列と見なしているだけです。（文字列は値0の「文字」'\0'を最後に追加するのが普通。単なるchar型の配列と見る場合はその限りではないです。）

配列とポインタはC言語でも異なったものですが、関数の引数として配列を与えた場合、それは配列の先頭アドレスしか関数には渡りません（配列の長さも関数にわたらないことに注意してください）。

従って、「関数の仮引数では」 char *argv[] とchar **argv が同じ意味になってしまいます。

argvは事実上は「（コマンドラインの）文字列の配列」を表しているがmain関数に渡されるのはその先頭ポインタだということです。argcがあるのはjavaと違って配列の長さは自動的には関数にわたらないからです。

関数の中で変数を宣言するときは、  
char a[100];  
char *b;  
では、sizeof(a) は100になりますが、sizeof(b)
はchar型のポインタのサイズになります。このような使い方の場合は配列とポインタは別物になります。C言語ではこの場合はa,bが初期化されていないのでよい例ではありません。

ちなみに、C/C++では argvの中身は書き換え可能となっているので取り扱いには注意が必要です。


CC BY-SA 3.0
2017-07-24T16:35:31.067
36638
2017-07-24T16:35:31.067
24517
11609
answer