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

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

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

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

C++

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

Q&A

解決済

3回答

1229閲覧

C++ ポインタについて

saito.kaz

総合スコア76

C

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

C++

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

0グッド

0クリップ

投稿2016/03/31 10:11

編集2016/03/31 11:06

###前提・実現したいこと

申し訳ありません。
下記の実行を再度したところ、コンパイルエラーがでず成功しました。
ご協力してくださった方、ありがとうございます。

C++を学習している中で疑問になっていることがあります。
ポインタについて混乱していることがあります

int * p : これは宣言時に、どこかの変数のアドレスしか受け取らない。
そのためPに何か代入するときは、&{変数}しか受け取らない(C++のルール)
また*Pとした場合、これはアドレスのメモリに格納されている値を指す

int* Q と宣言し、

*Q = 100 した場合、これは、どこかのメモリに配置されたメモリにある100を指す。

ここで疑問なのですが、Q=pとした場合、エラーが起きます。
これは、同じ型なのに、なぜエラーが発生するのでしょうか。

###ソースコード

#include <iostream> using namespace std; int main(void){ // Here your code ! int a, b; int * p; int * Q; a = 100; b = 200; p = & a; printf( "%d\n", * p ); // 100 * p = b; p = Q; printf( "%d\n", Q ); // 0 }

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

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

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

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

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

guest

回答3

0

次のコードはコンパイルエラーは起きません。
実行した時の出力を説明することができますか? (ポインターについて理解できていれば説明ができるはず)

c++

1#include <iostream> 2using namespace std; 3int main(void) { 4 int a, b; 5 int * p; 6 a = 100; 7 b = 200; 8 p = &a; 9 printf("*p = %d\n", *p); // 100 10 printf("a = %d b=%d\n", a, b); // 100 200 11 printf("\n"); 12 13 *p = b; 14 printf("*p = %d\n", *p); // 200 15 printf("a = %d b=%d\n", a, b); // 200 200 16 printf("\n"); 17 18 int * q; 19 printf("q = %ld\n", q); 20 q = p; 21 printf("q = %ld\n", q); // 200 22 printf("*q = %d\n", *q); // 200 23 printf("a = %d b=%d\n", a, b); // 200 200 24 printf("\n"); 25 26 *q = 100; 27 printf("q = %ld\n", q); // 200 28 printf("*q = %d\n", *q); // 200 29 printf("a = %d b=%d\n", a, b); // 100 200 30 printf("\n"); 31}

実行結果

$ ./a.out *p = 100 a = 100 b=200 *p = 200 a = 200 b=200 q = 0 q = 140734698748012 *q = 200 a = 200 b=200 q = 140734698748012 *q = 100 a = 100 b=200

投稿2016/03/31 11:38

katoy

総合スコア22324

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

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

0

>ここで疑問なのですが、Q=pとした場合、エラーが起きます。

エラーでますか?具体的に何てエラーが出るんでしょうか?
あと質問本文と、提示されたサンプルコードと内容が合致していないようですケド…エラーがでたコードを示して欲しいです。
ちなみにサンプルコードで *p = b; としているので結果は 200 ですがこの時 a の値も一緒に 200 に変更されているという点も忘れないでください…と念の為書いておきます。

投稿2016/03/31 10:28

HiroshiWatanabe

総合スコア2160

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

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

saito.kaz

2016/03/31 11:07

申し訳ありません。 コンパイルに成功しました。 先ほどなぜエラーでたのか混乱しております。 協力ありがとうございます。
guest

0

ベストアンサー

こんにちは。

TAKAYUKI_MIWAさんの理解は正しいと思います。
実際、

C

1int a=100; 2int *p; 3int *Q; 4p=&a;

とした時、Q=p;ではエラーになりません。
エラーになったコードを示して頂けないでしょうか?


【追記】
あ、下記はint型のポインタ変数Qを初期化しないまま使っているので結果は未定義です。
大抵の場合、不正なメモリアクセスで落ちます。

C

1int *Q; 2*Q=100;

投稿2016/03/31 10:17

編集2016/03/31 10:40
Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問