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

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

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

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

ポインタ

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

Q&A

解決済

1回答

1794閲覧

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

ALTLIA

総合スコア27

C

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

ポインタ

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

1グッド

1クリップ

投稿2017/02/22 03:00

###前提・実現したいこと
現在、柴田望洋先生の新・明解C言語の読み進めを
している所なのですが、ポインターまわりを読んでいる途中で
ふと疑問に思ったので質問したいとおもいます。

ポインタの書き方としての基本ですと

int a = 10;
int *p;
p = &a;
p = 777;

上記のコードを実行すると 変数aのアドレスに対して
777が書き込まれますが

int *p = &a;
と上記のような書き方をしては、だめなのでしょうか?

また
*p = &p = p ←の3つのPは同じ意味でしょうか

初心者ながらに、精一杯考えましたが、自身で納得のいく
答えが得られませんでした。
ご回答をお願い致します。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード
C言語 開発環境 windows7 64bit IDE Eclipse
ここにご自身が実行したソースコードを書いてください

int a[10]; int i = 50; int *p; int *ptr[10]; printf("%p\n",&a[0]); printf("%p\n",&a[1]); printf("%p\n",&i); printf("%p\n",*p); printf("%p\n",&p); printf("%p\n",ptr); printf("%p\n",&ptr[0]); printf("\n"); printf("\n"); printf("------------実験--------------"); printf("\n"); printf("\n"); int test = 100; printf("変数testのもともとの値は・・・%d",test); printf("\n"); int *point_test; point_test = &test; point_test = 10; printf("変数testの値は・・・%d",point_test); printf("\n"); printf("\n"); int test02 = 1000; printf("変数test02のもともとの値は・・・%d",test02); printf("\n"); int *point_test02 = &test02; point_test02 = 777; printf("変数test02の値は・・・%d",point_test02);

###試したこと

現在おさえていること
・ポインタとは アドレスを扱うための3つの機能の総称
・ポインタ型:int型とかdouble型とか
・ポインタ値:アドレス値は同じ意味
・ポインタ変数:よく出てくる *pとか

・ポインタ変数には 2つのモードがある
・int *p ← ポインタ変数モード、アドレス値しかもてない
p ← 通常変数モード これで数字を入れたり計算をすると
ポイントの示す先が書き換わる
###補足情報(言語/FW/ツール等のバージョンなど)
ソースコードの実行結果は以下になりました。

000000000022FE10
000000000022FE14
000000000022FE0C
00000000002F7AD1 //*pのアドレス
000000000022FE00 //&pのアドレス
000000000022FDB0
000000000022FDB0

------------実験--------------

変数testのもともとの値は・・・100
変数testの値は・・・10

変数test02のもともとの値は・・・1000
変数test02の値は・・・777

*pと&pのアドレスがなぜ別々になっているのでしょうか?

yohhoy👍を押しています

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

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

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

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

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

otn

2017/02/22 03:22

p = 777; は*pのタイプミスですよね?
ALTLIA

2017/02/22 03:56

いえ、タイプミスではなく これで結果がでて、書き換えができました。
guest

回答1

0

ベストアンサー

int *p = &a;
と上記のような書き方をしては、だめなのでしょうか?

これでも大丈夫です。

*p = &p = p ←の3つのPは同じ意味でしょうか

全て違います。
次のようなメモリ配置だとします(左側は番地(アドレス)、右側は値)

1000|10
1001|20
1002|30
1003|40
1004|p(1000)

こうなります。

*p = 10
&p = 1004
p = 1000

投稿2017/02/22 03:06

ttyp03

総合スコア16998

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

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

ALTLIA

2017/02/22 06:20

ありがとうございます。 すっきりわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問