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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1997閲覧

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

foo45

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/09/22 01:27

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ページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

foo45

2015/09/22 01:56

なるほど
yohhoy

2015/09/25 03:29 編集

<del>「複合リテラルの実体は文字列リテラルなどと違いブロック内でしか有効ではありません」は部分的に正しいですね。複合リテラルを構成する要素が全て定数値ならば、複合リテラルの実体もブロック外でも有効です(回答中の例示コードが該当)。</del> <del>とはいえ、ブロック内でのみ有効と考えた方が無難(安全)なことには賛同します。</del> 訂正:ちゃんと確認したら、上記コメントは誤りでした。ごめんなさい。ブロックスコープの複合リテラルは、そのスコープ内でのみ有効でした。定数値云々は、ファイルスコープに記述する際の話でした。
guest

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

MasaakiIrie

総合スコア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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問