No.4ベストアンサー
- 回答日時:
char *p;
は pをchar* という型で宣言しています。
便宜上、*をpの側に付ける構文が許されているので、誤解する人もいます。
また仕様上、"123" は char*型になっています。
ですから、
char* p="123";
は同じ型の実態での初期化なので、問題ありませんし、
p="123";
も問題ないことが分かるかと思います。
さて、
*p
と書いたときの*は意味が異なります。この*は、char*型であるpをchar型に変換する単項演算子です。
ですから
*p = '4';
であれば問題ありません。なぜなら'4'がchar型だからです。
これを実行するとpの内容が
"423"
にかわります。
ちなみに、さらに
*(p+1) = '5';
を追加で実行すると、pの内容は
"453"
になります。
さらに
*(p+100) = '5';
とると、メモリリークが起こります。(アプリケーションに与えられたメモリの範囲内であれば、OSによるチェックはすり抜けるので、暴走することもあります。)
この理由から、私は
*(p+i) = ‥‥
のような書きかたはしないようにしています。
昔は、この書きかたが速度的に有利と聞きましたが、いまはコンパイラが頭いいので、p[]の方を多用しています。
配列型の宣言のほうが、デバッガでとらえやすいという面もあります。
No.6
- 回答日時:
char *p="123";
の*はpの宣言におけるpの型のー部で
ポインタ型であることを表してます(charを指すポインタ)。
char* p="123";
と、それを意識した書き方をする人もいますね。
式の中で *p とかくと、ボインタpの指す、char型を表わす
ことになります。ポインタの逆参照と呼ぶことも有りますね。
char型なので、(char*)型である"456"を代入することは出来ません。
No.5
- 回答日時:
これ、C言語のよくない点だと思ってます。
C言語では、宣言するときに「使うときと同じような見た目」になるようになっています。
char *p ;
とは
「*p と使ったら char型になる変数pを定義する」
というように見ます。
これを意訳すると
「charへのポインタpを定義する」
となります。
さらにややこしいことに、
宣言と同時に「代入」できるのですが、その代入先はあくまで「変数」です。
/* 正確には、初期化といって、代入とは違う点があります */
char *p=“123”
と書いてあって *p へ代入しているように見えても、あくまで代入先は 変数p です。
違って見えても p=“123” なのです。
「宣言のときの代入先は、あくまで素の変数」ということを理解して、慣れていくしかないと思います。
No.3
- 回答日時:
>p=“456”じゃないといけない理由を詳しくお願いします!
char *p なので代入できるのはchar型のデータです。
*p=“456”
では、“456”、すなわち「文字列のアドレス」を代入しようとしてしまうのでエラーになります。
誤解の根源は
char *p=“123”;
の理解です。これを横着せずに記述すると
char *p;
と
p=“123”;
という意味ですよ。
*p=“123”;
ではありません。
つまり
*P は char型
ですが、
p はポインタ型
なので、pにはアドレスを代入する必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# いまc言語を独学で勉強しているのですがいまいちわかりません。 https://monozukuri- 3 2023/07/06 18:59
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- その他(悩み相談・人生相談) 通信制大学か大学か 9 2022/12/14 06:22
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- 大学受験 高3です。 武田塾に今月入塾しました。 通信制高校で偏差値は30です。偏差値と言っても最低ランクで学 9 2022/09/20 17:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
小数点入りの文字列をfloat型に...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語:小文字を大文字に変換す...
-
char 文字列型 の表現範囲が-12...
-
C言語のintとcharの違いってな...
-
SubStringの使い方について
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
ASCIIコードへの変換方法
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
簡易版smtpクライアント(メール...
-
fread()関数とfwrite()関数につ...
-
文字列を表すための配列とポインタ
-
ostringstreamではまりました
-
コマンドライン引数 *argv[]は...
-
fgetsで読み込んだ値のvector処理
-
【C言語】引数にファイルパスを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
C++17で、unsigned char * 配列...
-
文字列内の数字削除
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
C言語を用いた環境変数の作成/...
-
動的メモリの初期化方法について。
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
C言語:小文字を大文字に変換す...
おすすめ情報
char *p=“123”
*p=“456”
だとなぜダメなのでしょうか?
p=“456”じゃないといけない理由を詳しくお願いします!