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

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

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

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

ポインタ

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

配列

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

Q&A

4回答

2303閲覧

ポインタと配列と初期値について。

carnage0216

総合スコア194

C

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

ポインタ

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

配列

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

0グッド

0クリップ

投稿2021/07/28 00:00

編集2021/07/28 12:14
#include <stdio.h> int main(void) { char str[1] = "abcde"; for (char* p = str; *p; ++p) { ++(*p); printf("%s\n", &(*p)); } }

私としてはchar str[1] = "abcde";char型の配列の変数str[0]に文字列のの先頭の文字aが入るためコンパイルエラーになるのではないかと考えています。
どうかわかりやすく教えて下さい。
また、char str = "abcde";も間違いなのはstrが配列ではなく、たまの単純変数を扱っていないためでしょうか?だとしたら、 "abcde";の先頭のaの文字のみを扱うため間違っているのでしょうか?
ちなみに、char str[1] = "abcde";とchar str = "abcde"に初期値のための{ }が付かないのは何故でしょうか?正直、どんな時(ポインタや配列を使う時?)に{ }を使うのかよくわかりません。

また、char *str[] = { "abcde"}; ならコンパイルできる理由はchar型のポインタの配列により、{ }により文字列を初期値にして、文字列の先頭のaのアドレスをstr[0]に入れられるためでしょうか?
初期値を中括弧で囲む必要があるのは次の2つ。 char buff[20] = { 'a', 'b', 'c', '\0' }; char *parr[3] = { "abc", "de", "hello"}; と言われましたが、char型の配列やchar型へのポインタの配列などとありますが、文字や文字列を初期値するために{ }がついているとわかりました。
ただなぜ、 char *ptr; = "hello;はポインタがあるのに文字列が{ }に囲まれていないかわかりません。 どうかわかりやすく教えて下さい。

最後にchar str[] = "abcde";ではなく、 char *str[] = "abcde";とした場合、なぜコンパイルエラーを起こすのでしょうか?
文字列の先頭のaがchar型のポインタstr[0]の配列のメモリにaが入るのではないのでしょう?
どうかコンパイルエラーになる理由をわかりやすく教えて下さい。
最後の質問については char *str[] = {"abcde"};にすると解決するとの事ですが、なぜ{ }をつけると解決するのかわかりません。ポインタ変数strを扱う時は文字や文字列を{ }で囲まなければならないのでしょうか?
どうかよろしくお願いします。

編集
画像のプログラムにおいて質問があります。 "321"[2]では、3は[0]、2は[1]、1は[2] との事ですが、 では、char str[4] = "abc"では、aは[0] ではなく、aは[1]になると言われたのですが、"321"[2]では、3は[0]、2は[1]、1は[2] のやり方に沿うとaは[0]になると思い納得できません。 なぜaは[1]になるのでしょうか?

こちらが画像です。
プログラムの画像

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

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

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

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

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

maisumakun

2021/07/28 00:08

> コンパイルエラーになるのではないかと考えています。 どのようなエラーが出たのですか?
退会済みユーザー

退会済みユーザー

2021/07/28 00:52

荒らしに餌(回答)をあげないでください。
退会済みユーザー

退会済みユーザー

2021/07/28 08:39 編集

{}は配列 ""はポインタ yukkuri_reimu
episteme

2021/07/28 22:51 編集

> char str[4] = "abc"では、aは[0] ではなく、aは[1]になると言われたのですが 誰がどこで? 引用してください。(URLを示してください)
fana

2021/07/29 02:00

> …と言われたのですが… それを言った者にその場で問うことが最も確実で手早い. 当事者に問うなら背景事情から説明するような手間もかけずに済むのだし わざわざ別の場所に持ってくる意味がわからん
退会済みユーザー

退会済みユーザー

2021/07/29 02:14

半年前からポインタの質問してて、いつまで経ってもそこから進まずポインタの質問とマルチポスト繰り返してるだけだから、理解させようとするだけ無駄。 調べればすぐ判る入門レベルの話だし、入門書買ったり初心者向けサイトで勉強するか、丁寧な指導が欲しければお金払ってメンターを雇いなさい。
fana

2021/07/29 03:02

あ,すみません. 質問者のアカウント名を見ずに「意味がわからん」とか書いてしまいました. (行動の意味についての話ができるような相手ではないのだから,そのようなことをコメントする行為自体が無意味であった)
guest

回答4

0

char str = "abcde";も間違いなのは

単純に型が一致しないだけです("abcde"の型はchar[]です)。

char str[1] = "abcde";(中略)に初期値のための{ }が付かないのは何故でしょうか?

char[]を初期化する場合の"abcde"は、特殊な初期化子として扱われます。意味としては、char str[1] = { 'a', 'b', 'c', 'd', 'e', '\0' };と書いたのと同じ意味です(初期化子が多すぎる)。

char *ptr; = "hello";はポインタがあるのに文字列が{ }に囲まれていないかわかりません。

これは単に、"hello"という文字列リテラルのアドレスをchar *の変数の初期値として与えているだけです。配列の初期化ではないので波括弧は登場しません。

投稿2021/07/28 00:13

maisumakun

総合スコア146018

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

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

carnage0216

2021/07/28 05:06

ありがとうございます。 あの char str[1] = { 'a', 'b', 'c', 'd', 'e', '\0' }; においては、str[0]にはa、str[1]にはbが入ると思いますが、他のc〜ヌルまでは配列に入らないのでしょうか?
SaitoAtsushi

2021/07/28 07:34

入りません。 初期化子として与えられた要素の個数が配列の大きさよりも少ない場合は 0 が補われる規則ですが、初期化子が多い場合にはエラーです。 また、 char str[1] という宣言は大きさが 1 の配列であってインデックスの最大値は 0 です。
guest

0

C

1int main(void) { char str[1] = "abcde"; for (char* p = str; *p; ++p) { ++(*p); printf("%s\n", &(*p)); } }

なぜ、1行で書くんですか?

私としてはchar str[1] = "abcde";char型の配列の変数str[0]に文字列のの先頭の文字aが入るためコンパイルエラーになるのではないかと考えています。

コンパイルエラーになりません。警告メッセージが出るだけです。
なぜ、コンパイラのメッセージを読まないのですか?
エラー(error) と警告(warning) は違います。

実際に試した事実に基づいて質問してください。

投稿2021/07/28 11:10

kazuma-s

総合スコア8224

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

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

carnage0216

2021/07/28 11:26

ありがとうございます。 ちなみに、str[0]はaで正しいでしょうか?
carnage0216

2021/07/28 12:07

画像のプログラムにおいて質問があります。 "321"[2]では、3は[0]、2は[1]、1は[2] との事ですが、 では、char str[4] = "abc"では、aは[0] ではなく、aは[1]になると言われたのですが、"321"[2]では、3は[0]、2は[1]、1は[2] のやり方に沿うとaは[0]になると思い納得できません。 なぜaは[1]になるのでしょうか?
maisumakun

2021/07/28 12:26

> char str[4] = "abc"では、aは[0] ではなく、aは[1]になると言われたのですが それが間違いです。
carnage0216

2021/07/28 12:41

ん、と言うことは、 char str[4] = "abc"のaは[0]で正しかったのですか?
guest

0

どんな時(ポインタや配列を使う時?)に{ }を使うのかよくわかりません。

配列の初期化に使います。

int data[] = { 1, 2, 3 }; とか
char data[] = { 'a', 'b', 'c', '\0' }; とか。

※ char 配列は文字列リテラルでも初期化できます。 char data[] = "abc"; とか。

投稿2021/07/28 07:43

episteme

総合スコア16612

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

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

carnage0216

2021/07/28 10:42 編集

えと、要は、ポインタや配列に関係なく 文字列が'や,で区切られずひとまとまりとなるabcのような場合は{ }を使わなくても初期化できるわけでしょうか?
episteme

2021/07/28 11:45

↑ごめん 、「文字列が'や,で区切られずひとまとまりとなるabcのような場合」とは? 文字列リテラルのことですか?
episteme

2021/07/28 13:08

ならば本回答で述べたとおり。
guest

0

ただなぜ、 char *ptr; = "hello;はポインタがあるのに文字列が{ }に囲まれていないかわかりません。

その文字列の先頭アドレスでptrを初期化しているから、です。
配列ではありません

#記述ミスがあるのは横においてます

投稿2021/07/28 00:05

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問