c
1int *h = {1, 2, 3, 4, 5, 6}; 2 printf("%d", *(h)); 3 4 int h_2[] = {1, 2, 3, 4, 5, 6}; 5 printf("%d", *(h_2));
*hとh[]は同義なのではないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
違います。 *hとh[]が同じなのは仮引数の場合です。
追記:
K&R2日本語版ですと、121ページに仮引数に関して「まったく同一である」と書いてあります。注意するべきことは、それ以外についても「同一である」とは言っていないことです。仮引数以外ではちゃんと理解して使い分ける必要があります。
追記2:
ちなみにC99以降では複合リテラルが使えるので、固定長配列もリテラルとして作ることができます。配列リテラルへのポインタ、という形でint *hを初期化できます。
#include <stdio.h> int main(void) { int *h = (int[]){0, 1, 2, 3}; // 複合リテラル printf("h = {%d, %d, %d, %d}\n", h[0], h[1], h[2], h[3]); printf("sizeof(h) = %zd\n", sizeof(h)); return 0; }
ただし、複合リテラルの実体は文字列リテラルなどと違いブロック内でしか有効ではありませんので注意が必要です。
投稿2015/09/22 01:35
編集2015/09/22 06:01総合スコア1149
0
int *h = {1, 2, 3, 4, 5, 6};
int h_2[] = {1, 2, 3, 4, 5, 6};
h_2は配列ですが、*hは配列ではありません。
関数などで使う場合 h = &h_2[0] や a(int *p) a(h_2)とやりますけど
関数で渡るのは、先頭のポインターだけであり、配列を渡してる訳ではありません。
投稿2015/09/24 05:26
総合スコア1021
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
int * は、integer へのポインターです。配列として値を初期化することはできません。
次のプログラムの実行結果を予想することはできますか?
理解できない場合、ポインター、配列についての理解が不十分だと思われます。
c
1#include <stdio.h> 2 3int main(void) { 4 //int *h = {1, 2, 3, 4, 5, 6}; 5 //printf("%d", *(h)); 6 7 int h_2[] = {1, 2, 3, 4, 5, 6}; 8 printf("%d\n", *(h_2)); 9 printf("%d\n", *(h_2 + 1)); 10 11 printf("%d\n", h_2[0]); 12 printf("%d\n", h_2[1]); 13 printf("\n"); 14 15 int *h_3 = h_2; 16 printf("%d\n", *(h_3)); 17 printf("%d\n", *(h_3 + 1)); 18 19 printf("%d\n", h_3[0]); 20 printf("%d\n", h_3[1]); 21 printf("\n"); 22 23 int *h_4 = &h_2[0]; 24 printf("%d\n", *(h_4)); 25 printf("%d\n", *(h_4 + 1)); 26 27 printf("%d\n", h_4[0]); 28 printf("%d\n", h_4[1]); 29 30 printf("int h_2[] size=%ld\n", sizeof(h_2)); 31 printf("int* h_3 size=%ld\n", sizeof(h_3)); 32 printf("int* h_4 size=%ld\n", sizeof(h_4)); 33 34 return 0; 35}
実行例:
$ gcc 1.c $ ./a.out 1 2 1 2 1 2 1 2 1 2 1 2 int h_2[] size=24 int* h_3 size=8 int* h_4 size=8
投稿2015/09/22 04:29
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/22 01:56
2015/09/25 03:29 編集