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

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

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

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

ポインタ

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

C++

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

Q&A

2回答

1107閲覧

C言語で、間接演算子をつけたときのポインタ変数の格納先について

abct

総合スコア3

C

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

ポインタ

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

C++

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

0グッド

0クリップ

投稿2021/09/08 17:10

編集2021/09/11 08:40
#include <stdio.h> int main(void) { int x = 100; int* p = &x; printf("p=%p,*p=%p",&p,&(*p)); }

このコードを実行したところ、pと*pのアドレスは違いました。このサイトのモードの切替という段落で、間接演算子をつけたポインタ変数のアドレスは、つけていないときと変わらないと書いてあったので、このコードでいうpのアドレスと、pに間接演算子をつけたときのアドレスは変わらないと考えたのですが、自分の解釈にはどこに間違えがあったのでしょうか?

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

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

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

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

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

yominet

2021/09/08 17:33

参考サイトに「変わらない」という記述がみつからないので、たぶん 「この時、変数iと通常変数モードの*pは、全く同じメモリ領域を使っているということです。」 のことだと推測しますが、比較しているのは【変数i】と【通常変数モードの*p】の2つです。 あなたの書かれたソースコードでいえば、【変数x】と【通常変数モードの*p】になります。 printf("x=%p,p=%p,*p=%p",&x, &p, &(*p)); これを試してみてはいかかでしょうか
thkana

2021/09/09 13:38

二つの質問で同じ間違いをしているからきっと間違って覚えてしまっているのでしょうけれど、 「関節」じゃなくて「間接」ですから。
fana

2021/09/12 01:06

何か,以前も「モードがどうの」いう謎説明をどこかで読んで混乱してる人がいたような…? 「通常変数モード」とかいう独自用語を振り回すような説明が自身に合わないようであれば, さっさとその場所に見切りを付けて,もっとマシな説明をしている場所を探してみてはどうかな.
guest

回答2

0

タイトルが間違っています。

* は「関節演算子」ではなく、「間接演算子」です。
なぜ、「間接演算子」というのか分かっていますか?

int x = 100; とあったら、変数 x を 100という値で初期化しています。
変数 x に 100 という値を格納しているのです。

int *p = &x; *p = 100; とあったら、これは、
変数 x に 100 という値を間接的に代入しています。
変数 x に 100 という値を格納しているのです。

変数 x の値を参照したり、変更(別の値を格納)したりするのに、
x という変数名を使うのが直接参照です。

ポインタ変数 p が変数 x のアドレスを持っている時、
*p は変数 x を間接参照しているのです。

だから、* は「間接演算子」というのです。

このコードを実行したところ、pと*pのアドレスは違いました。

*p は変数 x です。2つの変数 p と x のアドレスが違うのは当然です。

関節演算子をつけたポインタ変数のアドレスは、つけていないときと変わらないと書いてあったので、

そんなことは書かれていません。
「ポインタ変数 p に間接演算子を付けた *p」は、変数 x です。
「ポインタ変数 p に間接演算子を付けた *p のアドレス」は、変数 x のアドレスです。

投稿2021/09/09 07:52

kazuma-s

総合スコア8224

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

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

0

yominetさんもご指摘されていますが、abctさんが書いたサンプルプログラムと
参考サイトが書いている内容は違いますよね。
それぞれ違いが判るようコメントを書きましたが、分かりますか?

C

1#include <stdio.h> 2 3int main(void) { 4 int x = 100; 5 int* p = &x; 6 printf("x=%p\n", &x); //変数xのアドレスを表示 7 printf("p=%p\n", &p); //変数pのアドレスを表示 8 printf("p=%p\n", p); //変数pの中身を表示 9 printf("*p=%p\n", &(*p)); //変数pが指し示す値(変数xの中身)が格納されたアドレスを表示 10} 11 12出力結果 13x=0x7ffde9395314 14p=0x7ffde9395308 15p=0x7ffde9395314 16*p=0x7ffde9395314

投稿2021/09/09 07:09

kaina

総合スコア418

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問