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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

2109閲覧

C言語のポインタについて

strike1217

総合スコア651

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/07/11 09:25

1、C言語のポインタについて以下のように書くとエラーが出る理由をおしえてください。
int *w;
*w = 5;

2、なぜアドレスで初期化しないといけないんですか??
(char型はアドレスで初期化する必要はなくそのまま文字列を代入することができます。int型との違いはなんですか??)
int a, *w;
w = &a;
*w = 5;

//////////////////////
char *b = "Hello";

3、wに*をつける場合とつけない場合の違いはなんですか??

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

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

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

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

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

guest

回答5

0

以下は、int*のポインタ変数wを定義していますが、その領域がmallocで確保されていません。
その確保されていないポインタ変数の指す場所へ5をセットしているからです。

int *w; *w = 5;

アドレスで初期化する理由は、初期化しないと何が入ってるか未定義で、処理系により動作が異なるためです。
住所のない郵便物が届けられないのと同じです。

char *b = "Hello";

の場合は、bに"Hello"というの文字が入ったアドレスが格納されているからです。
文字リテラルはメモリ上でアドレスを持っています。

投稿2016/07/11 09:49

moonphase

総合スコア6621

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

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

strike1217

2016/07/11 09:50

文字リテラルはメモリ上でアドレスを持っていんですか!! ありがとうございます!!
guest

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

Chironian

総合スコア23272

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

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

strike1217

2016/07/11 10:00

わかりやすいです。 ありがとうございました!!
guest

0

ベストアンサー

  1. int 型の初期化されていないポインタ

C

1// 変数を一つ用意します。名前は w です。 2// 変数は int 型のポインタです。中身は初期化されていないので不定です。 3int *w; 4 5// 初期化されていないポインタの指すアドレスに 5 を書き込むよう指示されました。 6// 5 はメモリ上のどこに書き込まれるかわかりません。 7// 昔の C コンパイラならエラーにはせず、実行した時点で暴走しました。 8*w = 5;
  1. 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;
  1. 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

Zuishin

総合スコア28660

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

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

strike1217

2016/07/11 09:56

”*w は w の指す位置に格納されている中身を指すのであって、アドレスではない。” わかりやすいです。 ありがとうございます!!
guest

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

A.Ichi

総合スコア4070

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

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

strike1217

2016/07/11 09:48

コアダンプを起こすんですか! ありがとうございます
guest

0

型をそろえる必要があるから。誤解を恐れずざっくり言うと

int は 整数型
char は 文字型

int* は 整数型へのポインタ
char* は 文字型へのポインタ

int a と宣言したときの &a は 整数型へのポインタ
int* w と宣言したときの *w は整数型

5 は 整数の定数
"Hello" は 文字型へのポインタの定数


あれ。一つ目の質問に回答してませんね。スミマセン

投稿2016/07/11 09:45

編集2016/07/11 09:52
matobaa

総合スコア2493

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

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

strike1217

2016/07/11 09:47

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問