質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

これは何故エラーになるのでしょうか?

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,499

score 98

int *h = {1, 2, 3, 4, 5, 6};
    printf("%d", *(h));
    
    int h_2[] = {1, 2, 3, 4, 5, 6};
    printf("%d", *(h_2));
*hとh[]は同義なのではないのでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

違います。 *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 10:56

    なるほど

    キャンセル

  • 2015/09/25 12:24 編集

    <del>「複合リテラルの実体は文字列リテラルなどと違いブロック内でしか有効ではありません」は部分的に正しいですね。複合リテラルを構成する要素が全て定数値ならば、複合リテラルの実体もブロック外でも有効です(回答中の例示コードが該当)。</del>

    <del>とはいえ、ブロック内でのみ有効と考えた方が無難(安全)なことには賛同します。</del>

    訂正:ちゃんと確認したら、上記コメントは誤りでした。ごめんなさい。ブロックスコープの複合リテラルは、そのスコープ内でのみ有効でした。定数値云々は、ファイルスコープに記述する際の話でした。

    キャンセル

0

int * は、integer へのポインターです。配列として値を初期化することはできません。
次のプログラムの実行結果を予想することはできますか?
理解できない場合、ポインター、配列についての理解が不十分だと思われます。

#include <stdio.h>

int main(void) {
  //int *h = {1, 2, 3, 4, 5, 6};
  //printf("%d", *(h));

  int h_2[] = {1, 2, 3, 4, 5, 6};
  printf("%d\n", *(h_2));
  printf("%d\n", *(h_2 + 1));

  printf("%d\n", h_2[0]);
  printf("%d\n", h_2[1]);
  printf("\n");

  int *h_3 = h_2;
  printf("%d\n", *(h_3));
  printf("%d\n", *(h_3 + 1));

  printf("%d\n", h_3[0]);
  printf("%d\n", h_3[1]);
  printf("\n");

  int *h_4 = &h_2[0];
  printf("%d\n", *(h_4));
  printf("%d\n", *(h_4 + 1));

  printf("%d\n", h_4[0]);
  printf("%d\n", h_4[1]);

  printf("int h_2[]  size=%ld\n", sizeof(h_2));
  printf("int* h_3   size=%ld\n", sizeof(h_3));
  printf("int* h_4   size=%ld\n", sizeof(h_4));

  return 0;
}
実行例:
$ 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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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)とやりますけど
関数で渡るのは、先頭のポインターだけであり、配列を渡してる訳ではありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る