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

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

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

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

Q&A

解決済

2回答

341閲覧

C言語 文字列配列char arr[10][4]の参照方法 arr[n-1][4] 何故-1が必要?

mjk

総合スコア303

C

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

0グッド

1クリップ

投稿2020/09/04 20:22

とある質問:与えられた数値に対して文字列を返す で回答した後に疑問が生じたので質問させて頂きます。

文字列の配列を参照する際に &arr[n - 1][4] とn-1しないと希望通りの出力がされないのは何故なのでしょうか?
直感的に &arr[n][4] とすれば希望通りの出力になる気がしたのですがn-1とすることで出力されたのでそういうものなのだと思っていましたが理由が知りたいので教えて下さい。

C

1#include <stdio.h> 2void func(int n) { 3 const char arr[10][4] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; 4 printf("%02d %s\n", n, &arr[n - 1][4]); 5} 6int main() { 7 for (int i = 0; i < 10; i++) { 8 func(i); 9 } 10 getchar(); 11}

※希望する出力にはなっているがコード内で&arr[n - 1][4]というようにn-1しなければならない理由が分からない

output

100 0 201 1 302 2 403 3 504 4 605 5 706 6 807 7 908 8 1009 9

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

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

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

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

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

guest

回答2

0

ベストアンサー

char arr[10][4];
とした時
arr[n][4]arr[n+1][0]の事なので、
その方法でnを表示したかったらn-1としてズレを戻さないといけないから。
arr[n-1][4]=arr[(n-1)+1][0]=arr[n][0]になります。


配列の宣言とアクセスでは、[]の中の意味が異なるので注意が必要です。

char arr[10][4] = {"ABC","DEF"};とした場合、
中身はこうなっています。
arr[0][0]='A'
arr[0][1]='B'
arr[0][2]='C'
arr[0][3]='\0'
arr[1][0]='D'
arr[1][1]='E'
arr[1][2]='F'
arr[1][3]='\0'

C言語の配列の添字はポインタ演算子によるオフセットなので、
こうとも書けます

arr[0][0]='A'
arr[0][1]='B'
arr[0][2]='C'
arr[0][3]='\0'
arr[0][4]='D'
arr[0][5]='E'
arr[0][6]='F'
arr[0][7]='\0'

つまり、[0][4]は次の列の[1][0]と同じアドレスを指します。
定義的には存在しない添字を入れても、そのまま動いてしまうのがC言語です。
[0][0]にアクセスしたいのに、「4文字分全てだから……」なんて考えて、[0][4]なんてかいてしまうと
[1][0]にアクセスしてしまうので、-1して、[-1][4]なんて不思議な書き方をする事になってしまいます。

C言語の文字配列は、あくまで配列の頭のアドレスを基準にアクセスするという、ポインタのイメージで扱わないと混乱します。

投稿2020/09/04 21:40

編集2020/09/04 21:44
amiya

総合スコア1218

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

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

mjk

2020/09/04 23:13

分かりやすい回答ありがとうございます。 何故?の理由がはっきり分かりました。 >>arr[1][0]='D' >>arr[0][4]='D' >>つまり、[0][4]は次の列の[1][0]と同じアドレスを指します。
guest

0

自己解決しました。
printf("%02d %s\n", n, arr[n]);
Wandbox

投稿2020/09/04 20:50

mjk

総合スコア303

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問