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

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

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

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

Q&A

7回答

1366閲覧

ポインタの*について教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2016/09/21 07:35

#include <stdio.h> int main() { int a, b; int *p = &a; a = 5; b = 10; printf("a = %d, b = %d, *p = %d\n", a, b, *p); p = &b; printf("a = %d, b = %d, *p = %d\n", a, b, *p); return 0; }

こんにちは。今、c言語の勉強をしているのですが、ポインタでわからないことが出てきたので教えてください。「int p = &a;」は「」が付くのに「p = &b;」には付かないのはなぜですか?同じようにPに*を付けたり消したりするとエラーになります。

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

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

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

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

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

guest

回答7

0

これは、ポインタのややこしさというより、ポインタの宣言のややこしさです。

int *p;とすると、「int *型の変数p」を宣言する、という意味になります。で、int* p;というように宣言することもできるのですが、この方法には1つ罠があって、int* p, q;と書くと、qはポインタでないint型になってしまいます。そのため、*を変数の側に寄せる書き方がよくなされます。

同じ型のポインタを多数使うなら、事前にtypedef int *intptr;のように宣言しておけば、intptr p, q;と素直に書けます。

投稿2016/09/21 07:40

maisumakun

総合スコア145183

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

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

0

int *p=&a

ポインタ変数の宣言
int *p

このポインタ変数に値を
入れる処理
p=&a
を行っています。

この状態で既に二つの処理は行われ
ポインタ変数の宣言は完了している
ためポインタ変数の前に*をつけて
はいけません。

ちなみに
a=b

&a=&b
と同じ意味です。

ご参考まで

投稿2016/09/21 14:07

Yatsurugi

総合スコア1628

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

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

raccy

2016/09/25 00:40

ykatsuhさんが編集される前の回答をほとんどコピーされているように見えます。規約では投稿データについての著作者の権利をteratail側へ渡していると見なされるため、著作権的には問題ないかも知れません。しかし、モラル的観点から、他回答者の回答をほぼそのままコピーすることはいかがなものかと思われます。どのようにお考えでしょうか?
eripong

2016/09/25 01:05

「tkatsufさん」は「ykatsuhさん」の誤記でした。失礼しました。
ykatsuh

2016/09/25 23:40

私が最初に Yatsurugiさんの投稿予定内容を 誤投稿してしまったからです。 申し訳ございません。
ykatsuh

2016/09/25 23:45

私が悪いのでYatsurugiさんには 全く責任はございません。
raccy

2016/09/26 09:42

> ykatsuhさん 「投稿予定内容を誤投稿」と言われても、なぜそんなことが出来たのかがわかりません。投稿する前のデータは一定期間保存されるようですが、投稿されるまでは本人以外は誰にも見えないはずです。それともykatsuhさんにはYatsurugiさんが投稿する前のデータが見えていたと言うことでしょうか?そうであれば、重大なバグですし、運営に報告すべき事案かと思います。
PineMatsu

2016/09/26 10:06

横からすいません。 この質問、ほぼ最初に回答を投稿されたお二方の回答でほぼ終わってると私は思います。 後は書き方や表現の違いだけで、皆さんほぼ同じ回答内容です。 そういう質問には、同じような回答を後から追加するのは控えた方がいいと私は思います。(回答を記入中に他の方が回答されて、内容がダブってしまった場合は仕方ないと思います。ポイント稼ぎとかそういうことを非難するつもりはありません。あくまで質問者から見てどうなのかということです) ただ、この質問ですが、質問者の方のコメントが一切見られないのと、回答は出てしまってるのに解決済みになっていない。これもちょっとどうかなとは思います。
guest

0

既に宣言されたポインタ変数の前に
*をつけるとおかしくなります

投稿2016/09/21 10:44

編集2016/09/21 14:05
ykatsuh

総合スコア22

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

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

0

こんにちは。

int *p = &a;はint型変数へのポインタpを定義して、そこに変数aへのポインタを設定しています。
2つのことを同時にやっています。
そこで、int *p;p = &a;の2つを同時に書いたと理解するとよいように思います。

投稿2016/09/21 07:39

Chironian

総合スコア23272

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

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

0

int *p = &a;

こっちはint型ポインタ変数「p」の定義 + 初期値セット。

p = &b;

こっちは代入。(上で既に宣言済のため)

投稿2016/09/26 09:07

Huyuto

総合スコア67

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

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

0

微妙に違う。

int *p = &a;

は 宣言と初期化を同時にに行っているのです。

(初期化ではなく代入になりますが、) 別の書き方をすると、

int *p;
p = &a;

と大体同じ。( 初期化か代入かの違いはあるけど。 )

投稿2016/09/26 04:22

BeatStar

総合スコア4958

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

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

0

int *p=&a
は、ポインター変数の宣言と、ポインター変数への代入を一度にする書き方ですね。
これを宣言と、代入を分けて書くと、
int *p
p=&a
と、なりますね。

投稿2016/09/21 08:39

KEgt

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問