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

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

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

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

ポインタ

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1353閲覧

Cのポインタについての質問です。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2015/04/24 12:52

編集2015/04/24 13:41

lang

1char a[] = "あいうえお"; 2char *b = a;

aの要素数は6で、
a[0] = あ;
a[1] = い;


a[6] = \0;
となると思うのですが、その配列を *b に代入した場合、どうなるのでしょうか?
bは何になりますか?

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

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

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

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

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

guest

回答4

0

配列を代入しているわけじゃなくて、配列の先頭要素をbに代入しています。
代入後は、a[i]と書かずにb[i]と書いてもaの配列の中身にアクセスできると言うことです。

投稿2015/04/24 13:18

otn

総合スコア84710

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

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

0

ベストアンサー

lang

1char a[] = "あいうえお";

aの要素数は6で、
a[0] = あ;
a[1] = い;


a[6] = \0;

日本語の場合、1文字=char1個分とはなりません。使用する文字コードにもよりますが、Shift-JISやEUCならば aの要素数は11 に、UTF-8(Unicode)ならば aの要素数は16 になります。

英語のアルファベットならば 1文字=char 1個分となるため、基本的な考え方はあっています。下記コードでは aは要素数 6 の配列 になります。(配列インデクスは0始まりですから、終端文字'\0'の位置はインデクス5です。)

lang

1char a[] = "ABCDE"; 2// a[0] = 'A'; 3// a[1] = 'B'; 4// ... 5// a[4] = 'E'; 6// a[5] = '\0';

lang

1char *b = a;

その配列を *b に代入した場合、どうなるのでしょうか?
bは何になりますか?

解釈が少し誤っています。配列の先頭要素を指すポインタが、**(bではなくて)* b へ代入されます。下記に図解(ぽいもの)を書いておきます。ご参考に。

lang

1char a[] = "ABCDE"; 2char *b = a; 3/* 4 +---+---+---+---+---+----+ 5 a[6] | A | B | C | D | E | \0 | 6 +---+---+---+---+---+----+ 7 ^ 8 | 9 +---+ | 10b | *---+ 11 +---+ 12*/

bは配列先頭要素を指す、つまり b == &(a[0]) となります。またbの参照先*bは 'A' となります。

投稿2015/04/24 16:58

編集2015/04/24 17:37
yohhoy

総合スコア6191

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

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

0

ニュアンスが伝わるか微妙ですが。。。

変数b("*"をつけないbですよ)にa[]の先頭のアドレスが代入されます。
a[]はそのままで、*bがa[]と同じ実体を参照するようになります。

それと、全角文字は1文字1バイトではありません(S-JISは2バイト、Unicodeは3バイトだったような)。
ですので、全角5文字✕全角一文字のバイト数+1バイト(NULL文字)がa[]の要素数になります。

投稿2015/04/24 15:15

HachiyaKouya

総合スコア85

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

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

0

余計なお世話かもしれませんが・・・

char a[] = "あいうえお";
aの要素数は6で、
a[0] = あ;
a[1] = い;


a[6] = \0;

コンパイラと文字コードによると思いますが、11バイト(shift-jisの場合)になりませんか?

投稿2015/04/24 14:06

cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問