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

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

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

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

ポインタ

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

C++

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

Q&A

解決済

6回答

1445閲覧

c言語ダブルポインタについて

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

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

C++

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

0グッド

1クリップ

投稿2018/12/16 14:17

int x=0;
と与えられているとして、
もし仮に
*x=??
と何か代入したらxつまり0が格納されているメモリアドレスが変わるのでしょうか?

関数内でしたら
*xに値渡しがされているとすると
**x=??
になります。

つまり既に値が与えられているもののアドレスを変更するとその値の格納場所は変わるのか?ということです。

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

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

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

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

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

guest

回答6

0

ベストアンサー

いまいち言ってることが意味不明ですが、、

int x=0;

としている場合のxのアドレスは &x です
*x としてしまうと(ワーニングやらエラーが出るでしょうが)、xの内容のアドレスのアクセスとなり(0番地のアクセス)、アクセス違反となります

x のアドレスを持ってきてなんやかやしたいなら、

int x=0;
int* p=&x;
*p =1;

とかなんとかになりますね

投稿2018/12/16 23:26

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2018/12/16 23:56

つまりポインタは型宣言しただけでは自動的にそのアドレスを受け取ってくれないということでしょうか?つまり int *x; と宣言してもただのxという名を持つint型へのポインタ型であって、 この時点ではint xとは何の関係も持たない(同じ変数宣言なのでエラーが出る)ということでしょうか?
y_waiwai

2018/12/17 00:17

そういうことです。 ちなみに、グローバル変数で定義すると0クリアされるので、そのまま使うとNULLポインタアクセスとなりますが、 ローカル変数で定義するとデタラメの内容になるので、話はややこしくなります ポインタの扱いを誤ると、致命的なエラーとなるので注意しましょう。 特にC言語でいやらしいのは、エラーが出たからと言って止まってくれない場合があるってことですね
guest

0

こんにちは。

int *x=0;*x=0;の意味を混同されているように思います。
この2つの表記はちょっと似ていますが、全く意味が異なるのです。(個人的にはC言語の黒歴史と思います。)

前者は int* x=0; と捉えたほうが理解しやすいです。int*はint型へのポインタ型を意味しますから、int型ポインタ x を宣言し、0で初期化しています。(ポインタxが0番地を指すように設定する。)
後者は、ポインタ x が指すメモリを 0 クリアしています。

もしも下記のように記述すると、ほとんどの処理系で不正メモリアクセスにて落ちます。

C++

1int* x=0; 2*x=0;

xはアドレス0番地を指し、その0番地に 0 を設定しようとしています。ほとんどの処理系で0番地にはメモリが割り当てられていませんのでアクセス違反となります。

投稿2018/12/17 06:59

編集2018/12/17 07:01
Chironian

総合スコア23272

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

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

0

つまり既に値が与えられているもののアドレスを変更するとその値の格納場所は変わるのか?ということです。

「値が与えられているもののアドレスを変更する」ことはできません。
Aさんの住所が3番地でしたので、住所録に「3番地」と書きました。その後3番地を「2番地」に書き換えました。Aさんは3番地から2番地へ引っ越したのでしょうか?
と同じような質問に思えます。

変更することができるのは、
「保持しているアドレスの値を変更する」つまり、住所録を書き換える
ことです。引っ越したかどうかとは無関係です。
もし、3番地から2番地へxの値を移動したいのなら、3番地から2番地へのデータのコピーを明示的に記述する必要があります。

「アドレスを保持しているもの(変数)」が"ポインタ"です。
ポインタは「矢印」のようなものです。矢印の向きを変えたからといって、矢印が示す対象が移動する訳ではありません。

以上が答えになっていますか?

投稿2018/12/17 02:17

nob.

総合スコア711

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

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

0

皆様のおかげで理解しました、ありがとうございました。
ポインタもただの変数に過ぎない、という視点が抜けていました。

投稿2018/12/26 10:16

編集2018/12/26 10:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

>xつまり0が格納されているメモリアドレスが変わるのでしょうか?
xのメモリアドレスが変わるわけではありません。

*(int )x = ?? だと、xをポインタと見なした場合の参照先を書き換えます。
ただし、xの値は0なので、ヌルポインタの参照先にアクセスすることになるので何が起こるかわかりません(通常はアクセス違反になるが、仕様としてはエラーメッセージが出る保証もありません)。
(厳密に言うと、仕様上はint x=0;のとき(int
)x がヌルポインタになる保証さえありません。(int *)0 と整定数の0をポインタにキャストされた場合にヌルポインタになることが保証されてるだけです。c言語の闇中の闇です。まずヌルポインタになるので今は気にしなくていいですが)。

int a = 1; int b = 2; int*x = &a; x = &b; *x = a;

だと、*x (xが指しているオブジェクト)のアドレスがbのアドレスに変わってます。最後の文で代入することでbの内容がaの値になります。このように代入などすれば値は変わりますが自動的にbの値がaの値になるわけではありません。

投稿2018/12/22 08:27

myoon

総合スコア100

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

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

0

int x=0;

と与えられているとして、
もし仮に
*x=??
と何か代入したらxつまり0が格納されているメモリアドレスが変わるのでしょうか?

この場合、xはポインタじゃないので*x=??;というのは出来ません。コンパイル時にエラーになります。

int *x; int a=0,b=1;の宣言で、x=&a;だと*x0になります。その後、x=&b;にすると、*x1になります。

投稿2018/12/16 14:27

otn

総合スコア84555

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

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

退会済みユーザー

退会済みユーザー

2018/12/17 00:13

つまり普通の型として与えられているものを*つけてその型のアドレスを取り出すことはできないのでしょうか? int x; として型が宣言されていて *x というものは、int *xが宣言されていない場合(コンパイルエラーが出ると思いますが)、xのアドレスを指すわけではないということですか?
otn

2018/12/17 02:04

何であっても、「*つけてその型のアドレスを取り出す」というのはできません。演算子の意味が違います。 xのアドレスは @x ですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問