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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

1140閲覧

c言語のchar型ポインタについて

K.M.PEANUTS

総合スコア40

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

1クリップ

投稿2021/04/18 00:06

c

1#include <stdio.h> 2 3void output_str_reverse(char **p, int n) 4{ 5 for (int i = n - 1; i >= 0; i--) 6 printf("%s\n", p[i]); 7} 8 9int main(void) 10{ 11 char *a[3] = { "abc", "def", "ghi" }; 12  printf("%s\n", a[0]); 13 output_str_reverse(a, 3); 14}

ポインタについて理解できない部分があるので上記のコードを例に質問させていただきます。

main関数内のポインタの配列において、a[0],a[1],a[2]にはそれぞれ各要素の先頭文字へのポインタ、すなわち"a","d","g"へのポインタが格納され、それによって*a[0],*a[1],a[2]はそれぞれa,d,gを表すことがわかりました。しかしa[0]がaへのポインタを表すならば、上記コードの printf("%s\n", a[0]);でなぜabcが出力されるのかわかりません。(a + 0)をa[0]と表せるポインタの性質が関係しているのかと思っているのですが、結局a[0]は何を表しているのでしょうか?

二つ目の質問なのですが、output_str_reverse(a, 3);における引数aは何を表しているのでしょうか?
例えば、int a[3];におけるaはa[0]へのポインタ&a[0]を表しますよね。わかりやすく教えていただければ幸いです。

質問長くなってすみません。初心者なのでわかりやすく教えてもらえると嬉しいです。

気になる質問をクリップする

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

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

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

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

guest

回答3

0

ベストアンサー

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char *p = "abc"; 6 printf("%s\n", p); 7}

p はポインタで、"abc" の 'a' を指しています。

'a' を指すポインタをもらった printf は、書式の "%s" という変換指定から、
そのポインタの値が、文字列の入った配列の先頭アドレスだと分かるので、
文字列の終端を表す '\0' が見つかるまでのすべての文字を表示できます。

char *a[3] = { "abc", "def", "ghi" }; の a[0] は p と同じです。

output_str_reverse(a, 3); の a は &a[0] です。
a[0] には "abc" の 'a' を指すポインタが入っています。
a は &a[0] で、そのポインタを指すポインタです。
a を p にもらった output_str_reverse(char **p, int n)
p[0] で a[0] の値を得て、"abc" を printf で表示できます。
p[1] で a[1] の値を得て、"def" を printf で表示できます。

投稿2021/04/18 16:39

kazuma-s

総合スコア8224

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

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

K.M.PEANUTS

2021/04/19 05:12

めちゃくちゃ理解できました!
guest

0

結局a[0]は何を表しているのでしょうか?

"abc"をさすポインタ

それによって*a[0],*a[1],*a[2]はそれぞれa,d,gを表すことがわかりました。

これがわかっていると言うなら、自明なことだと思いますが

char *a[3] = { "abc", "def", "ghi" };

と定義されてます
char* の配列、ですね

投稿2021/04/18 00:34

編集2021/04/18 00:36
y_waiwai

総合スコア88042

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

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

0

結局a[0]は何を表しているのでしょうか?

"abc"という文字列定数を指すポインタです。

output_str_reverse(a, 3);における引数aは何を表しているのでしょうか?

aは配列なので、引数として渡すとその先頭要素を指すポインタとなります。

投稿2021/04/18 00:17

maisumakun

総合スコア146018

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

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

maisumakun

2021/04/18 00:17

> 例えば、int a[3];におけるaはa[0]へのポインタ&a[0]を表しますよね。 これと全く同じで、aはポインタの配列なのでポインタへのポインタとなる、というだけです。
K.M.PEANUTS

2021/04/18 02:00

おそらく理解できました! 今回は文字の配列ではなく文字列の配列を扱うため、char*の配列を利用した。aは配列であり、配列は引数にすることができないため、そのポインタを引数にする。今回のaはポインタの配列のため、ポインタのポインタを引数にすることになり、受け取る側もポインタのポインタで受け取った。 という認識で合っていますか?
dodox86

2021/04/18 02:13

@質問者さん ちなみにC言語のmain関数 int main(int argc, char *argv[]) のargv部分も同じ構造で、本質問と同様の内容になります。 int main(int argc, char **argv) と書く人もいるので、併せてそういった情報にあたると理解が深まるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問