初質問です。
確認のための質問なのですが...
現在読んでいる本でchar array[];と宣言した1次元配列について、「&arrayはchar*型のarrayにアドレス演算子を付けたものだから, charへのポインタへのポインタと解釈される」と書かれているのですが、&arrayはchar型配列へのポインタですよね?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答4件
7
ベストアンサー
いくつかの意見が出ていますが、仕様に照らすとどれも正しいとは言えないのでより厳密な解釈を書きます。 結論から言うと、 char array[]
と宣言された array
があるとき、 &array
はポインタのポインタではありません。 「&array
は char
型配列へのポインタ」という解釈が正しいです。
C/C++ で配列とポインタの関係を複雑にしているのは、配列はその先頭要素へのポインタへ暗黙の型変換をされるという規則です。 今回の質問について言えば、 array
は char
の配列であり、それを型で言うなら char[]
です。 これは暗黙の型変換によって char*
になります。
ただし、この暗黙の型変換には例外があり、 &
を適用するときは起こらないことになっています。 &
はアドレスを得る演算子ですから配列 array
のアドレスを得るという効果として現れることになります。 &array
は array
という配列を指すポインタです。
array
は配列 (型で言えばchar[]
) であるが配列の先頭要素を指すポインタ (型で言えばchar*
) として使える&array
は配列を指すポインタ (型で言えばchar(*)[]
) である
値として見れば「配列の先頭要素を指すポインタの値」は「配列を指すポインタの値」と普通は同じでしょう。 array
と &array
は型違いで同じ場所を指しているポインタと考えられます。
ただし、 char array[]
が仮引数として宣言されていた場合は別の規則によって char* array
と読み替えられるので、 &array
はポインタのポインタです。
投稿2018/03/17 15:41
編集2018/03/17 23:42総合スコア5292
1
[ご参考] コンパイラ(Visual C++ 64bit)に訊いてみた。
C++
1#include <iostream> 2#include <typeinfo> 3 4int main() { 5 char array[5]; 6 std::cout << " array : " << typeid(array).name() << std::endl; 7 std::cout << "&array : " << typeid(&array).name() << std::endl; 8}
実行結果:
array : char [5] &array : char (* __ptr64)[5]
投稿2018/03/22 04:32
総合スコア16596
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
1
配列名をポインタとして評価する場合、先頭の要素のアドレスを返します。
ポインタが配列を示しているか、ただ一つの数を示しているか識別する方法はありません。
ですので『arrayはcharポインタとして評価される』と言うのも概ね正しいです。
ただし残念ながら、以下の記述は全体的には誤りです。
&arrayはchar*型のarrayにアドレス演算子を付けたものだから, charへのポインタへのポインタと解釈される
arrayの先頭アドレス(char*)を取る原則的な方法は&array
です。
ただし、いくつかの文脈を除き、単にarray
と書いていいだけなのです。
&array
はcharへのポインタのポインタではなく、charへのポインタです。
例えば以下のプログラムでそれを知ることが出来ます。Wandbox
C
1char hoge[] = "hoge"; 2 3printf("%p\n", hoge); 4printf("%p\n", &hoge); 5printf("%p\n", &hoge[0]);
アドレスは全て同じです。
投稿2018/03/17 06:10
総合スコア35646
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
0
C言語の特例のため、char型配列名はchar型のアドレスと同一視できるため、
どちらも正しいです
投稿2018/03/17 05:17
編集2018/03/17 05:23総合スコア87204
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答へのコメント
2018/03/17 14:51
2018/03/17 15:31
2018/03/18 09:23
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
同じタグがついた質問を見る
C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2018/03/18 06:51
2018/03/18 09:54
2018/03/22 03:31
2018/03/22 10:52
2018/03/22 15:56
2018/03/22 16:23 編集
2018/03/23 08:36
2018/03/23 09:59