1、C言語のポインタについて以下のように書くとエラーが出る理由をおしえてください。
int *w;
*w = 5;
2、なぜアドレスで初期化しないといけないんですか??
(char型はアドレスで初期化する必要はなくそのまま文字列を代入することができます。int型との違いはなんですか??)
int a, *w;
w = &a;
*w = 5;
//////////////////////
char *b = "Hello";
3、wに*をつける場合とつけない場合の違いはなんですか??
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
以下は、int*のポインタ変数wを定義していますが、その領域がmallocで確保されていません。
その確保されていないポインタ変数の指す場所へ5をセットしているからです。
int *w; *w = 5;
アドレスで初期化する理由は、初期化しないと何が入ってるか未定義で、処理系により動作が異なるためです。
住所のない郵便物が届けられないのと同じです。
char *b = "Hello";
の場合は、bに"Hello"というの文字が入ったアドレスが格納されているからです。
文字リテラルはメモリ上でアドレスを持っています。
投稿2016/07/11 09:49
総合スコア6621
0
こんにちは。
1、C言語のポインタについて以下のように書くとエラーが出る理由をおしえてください。
エラーではなく、「未初期化変数をアクセスした」のような警告と思います。
wはint型へのポインタ(int型の先頭アドレスを保持する)です。
そのint型の先頭アドレスを設定していません。つまり、初期化していないです。
なので、親切なコンパイラなら警告してくれると思います。
2、なぜアドレスで初期化しないといけないんですか??
(char型はアドレスで初期化する必要はなくそのまま文字列を代入することができます。int型との違いはなんですか??)
char型もアドレスで初期化しています。
char *b = "Hello";
これは分解すると下記なのですが、文法上まとめて書くことが許されてます。
char *b;
b = "Hello";
つまり、bはchar型の先頭アドレスを保持します。
"Hello"
と書くと'H'が保存されているアドレスに変換されます。
そして、'H'に続けて'e', 'l', 'l', 'o', '\0'が入ってます。
その'H'が保存されているアドレスがbへ設定されます。
C言語の多くの関数はint型はint型へのポインタとして取り扱うものが多いですが、int型配列へのポインタとしても扱うことが許されてます。
同様に、char型についてはchar型配列先頭へのポインタとして取り扱う関数が多いのですが、int*型と同様char型へのポインタとしても使えます。
そして、最後に、文字列用関数(strxxx系)は文字列の最後にNULLが入っていると仮定して動作します。(なので、入ってなかったら不正アクセスが発生しますね。)
逆に非文字列用関数(memxxx系)は最後のNULLを仮定しません。代わりに有効なバイト数を指定します。
投稿2016/07/11 09:57
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
- int 型の初期化されていないポインタ
C
1// 変数を一つ用意します。名前は w です。 2// 変数は int 型のポインタです。中身は初期化されていないので不定です。 3int *w; 4 5// 初期化されていないポインタの指すアドレスに 5 を書き込むよう指示されました。 6// 5 はメモリ上のどこに書き込まれるかわかりません。 7// 昔の C コンパイラならエラーにはせず、実行した時点で暴走しました。 8*w = 5;
- int 型の初期化されたポインタ
C
1// 変数を一つ用意します。名前は a です。 2// 変数は int 型です。メモリ上の位置は決まっていますが、中身は初期化されていないので不定です。 3int a; 4 5// 変数を一つ用意します。名前は w です。 6// 変数は int 型のポインタです。中身は初期化されていないので不定です。 7int *w; 8 9// w を a のアドレスに初期化しました。 10// a は初期化されていないので、何が書き込まれているかわかりませんが、アドレスは決まっています。 11w = &a; 12 13// w の指すアドレスに、5 を書き込むよう指示されました。 14// w の指すアドレスは、a のデータの格納されるアドレスと同じです。 15// a の中身は今まで不定でしたが、現在 5 になりました。 16*w = 5;
- char 型の初期化されたポインタ
C
1// 変数を一つ用意します。名前は b です。 2// 変数は char 型のポインタです。 3// 文字列を扱うのが便利なように、char 型には特別な初期化用の書き方が用意されています。 4// 次のようにした場合、メモリ上に "Hello" というデータが用意され、b はその最初のアドレスを指すように初期化されます。 5char *b = "Hello";
C のポインタがややこしいのは、このように文脈によって同じ表記でも意味が変わってくることです。
C
1int *w = 5; // エラーになる。 2char *b = "hello"; // エラーにならない。 3int *w = &a; // エラーにならない。w に &a というアドレスを代入しているのであって、*w に代入しているのではない。 4printf("%d\n", *w); // *w は w の指す位置に格納されている中身を指すのであって、アドレスではない。
これは、よく使う場面でのタイピング数を減らし、外見をすっきりさせるためでありますが、慣れてない者にとっては今がどの文脈かわからず混乱します。
本当に C の悪いところだと思いますが、決まっているものは仕方ないので、慣れてください。
投稿2016/07/11 09:54
総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
int a, *w; //aというint4バイトのエリアとintを指すポインターwを定義します。
w = &a; //a項目のアドレスをwでポイントするようにします。
*w = 5; //wのアドレスの5を設定します。
wは定義された2行目が無くポインターのままだと値の保管場所が未確定のままになります。
コアダンプします。
//////////////////////
char *b = "Hello"; ”Hell0”とプログラム内に定義した値のアドレスの先頭をbポインターに入れます。
投稿2016/07/11 09:46
総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
型をそろえる必要があるから。誤解を恐れずざっくり言うと
int は 整数型
char は 文字型
int* は 整数型へのポインタ
char* は 文字型へのポインタ
int a と宣言したときの &a は 整数型へのポインタ
int* w と宣言したときの *w は整数型
5 は 整数の定数
"Hello" は 文字型へのポインタの定数
あれ。一つ目の質問に回答してませんね。スミマセン
投稿2016/07/11 09:45
編集2016/07/11 09:52総合スコア2493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/11 09:50