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

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

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

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

C++

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

Q&A

解決済

3回答

405閲覧

c言語 ポインタ型に対するアドレス演算子

puroko3

総合スコア185

C

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

C++

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

0グッド

0クリップ

投稿2019/08/04 06:01

c

1#include <stdio.h> 2 3int main() { 4 char c = 'A'; 5 char *cp = &c; 6 printf("%p\n", &c); 7 printf("%p : %p", &cp, cp); 8}

はじめてのCプログラミングというかなり古い本で、上記のようなコードが出てきました。
(質問用に少し改ざんしている)

実行してみると、cpと&cpが違う実行結果になり、&cpが指し示すアドレスがcpよりも前のアドレスになるんですが、&cpで表示されるアドレスってどこを指し示してるんでしょうか?

また、変数やら配列のアドレスは、メモリが確保した一番初めのアドレスを指し示してると思うのですが、それより前のアドレス指し示しているという事は、エラーが起きないだけで、あまり望ましくない/使わない操作という事なのでしょうか?

わかる方いらしたらよろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

次のコードとその実行結果を研究してみてください。
a.c

c

1#include <stdio.h> 2 3int main() { 4 char c = 'A'; 5 char *cp = &c; 6 7 printf(" &c: %p, c: %c\n", &c, c); 8 printf("&cp: %p, cp: %p, *cp: %c\n", &cp, cp, *cp); 9 printf("&cp: %p, cp: %p, cp[0]: %c\n", &cp, cp, cp[0]); 10 11 printf("\n"); 12 char *pt = (char*)&cp; 13 for(int i = 0; i < 18; i++) { 14 printf("%p: %02X\n", pt, (*pt) & 0xFF); 15 pt++; 16 } 17}

実行例
イメージ説明

メモリー内容は次のようになっているわけです。

fa40 | 4B | <-- cp (内容は &c fa41 | 9A | fa42 | 15 | fa43 | EF | fa44 | FE | fa45 | 7F | fa46 | 00 | fa47 | 00 | ... fa4b |'A' | <-- c ...

投稿2019/08/04 08:18

katoy

総合スコア22324

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

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

0

cp は c のあるアドレスを指しています。
それは &c と同じです。

&cp は cp のあるアドレスを指しています。

両方とも普通はスタックにあるはずなのでアドレスは近いところにあると思います。

追記

C

1char *cp = &c;

これは次のコードと同じです。

C

1char *cp; 2cp = &c;

投稿2019/08/04 06:06

編集2019/08/04 06:09
Zuishin

総合スコア28660

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

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

puroko3

2019/08/04 06:19

回答ありがとうございます。 > &cp は cp のあるアドレスを指しています。 ポインタ型もメモリ確保が必要だという事が、頭の中にありませんでした^^; そのアドレスを指し示しているという事ですね。 また機会があればお願いします。
guest

0

ベストアンサー

&cpは、cpという変数のアドレスです
# &cは、cのアドレス

これに関しては、その変数の型がどうであろうと変わりません

投稿2019/08/04 06:03

編集2019/08/04 06:04
y_waiwai

総合スコア87774

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

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

puroko3

2019/08/04 06:08

なるほど、そういう事でしたか。 ポインタ型を宣言するのにも、メモリ確保が必要という事を失念してました。 おかげさまでスッキリしました。 また機会があれば、よろしくお願いします。
y_waiwai

2019/08/04 06:11

整数型というのは整数が格納される型で、 ポインタ型というのは、ポインタ(アドレス)が格納される型ってことです ちとパズルみたいになってややこしいですが。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問