C言語プログラミング
ポインタと関数についてよくわかりません。
void func(int *pvalue);
int main(void)
{
int value = 10;
printf("&value = %p\n",&value); func(&value); /* アドレスを渡す */ printf("value = %d\n",value);
return 0;
}
void func(int *pvalue)
{
printf("pvalue = %p\n",pvalue);
*pvalue = 100; /* 通常変数モードに切り替えて代入 */
return;
}
まずfunc関数にvalueのアドレスを送り
int *pvalueで受けとります。
ここでの*pvalueは数字ですか?アドレスですか?
func関数ないの(printf)pvalueはアドレスですか?数字ですか?
%pを%dに変えたら値が入るのでしょうか?
%pについてもわからなくなってしまいました。
最期の*pvalueは変数という見方でしょうか?
頭がこんがらがって来ました。
教えてください。(見分け方笑)
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
> ここでの*pvalueは数字ですか?アドレスですか?
呼び出し側は&valueと変数valueのアドレスを渡しています。
したがって受ける側のpvalueで受け取るのはmail関数内で定義される変数valueのアドレスです。
ただし、アドレスも数値と言えば数値です。動作しているプログラム空間内の位置を示す値ですから。
> func関数ないの(printf)pvalueはアドレスですか?数字ですか?
一度受け取った変数の内容は代入を粉わない限り変化しません。
よって受け取った値のままで、それはmail関数内で定義される変数valueのアドレスです。
> %pを%dに変えたら値が入るのでしょうか?
それは値が入るかどうかではなく%pや%dの意味するところは何か・・・ということです。
> 最期の*pvalueは変数という見方でしょうか?
mail関数内で定義される変数valueに値をセットしています。
参考まで。
No.2
- 回答日時:
ポインタの導入部分はかなりデリケート...
理解してもらえるように書けるかは自信はありませんが頑張ってみます
>ここでの*pvalueは数字ですか?アドレスですか?
まず根本的な部分から説明します
ポインタ変数というのはアドレスを記憶するための変数です。
それ以上でも、それ以下でもありません
渡されたアドレスを記憶するもの、それをしっかりと理解してください
ポインタの宣言方法は
int *pvalue;
とこのように書きますね
個人的にはこの時点で誤解を招くと思っています
実はアスタリスクの位置は
int* pvalue;
とこのように書いても問題ありません
私はこちらの書き方が好きです。
「int型のポインタ変数」の「pvalue」を宣言します
というのが分かりやすいと思います
void func(int *pvalue)
というのはfunc関数で使用する「pvalue」という「int型のポインタ変数(仮引数)」を定義しています
ということで、数字かアドレスかと言われれば、アドレスですということになります。
なぜかというと最初に言ったとおり、ポインタ変数はアドレスを記憶するための変数です
それ以外のものは入れることができません
>func関数ないの(printf)pvalueはアドレスですか?数字ですか?
つまり、この答えも1つです。
アドレスです。ポインタ変数はアドレs(ry
しかし
*pvalue = 100;
という記述がありますね
「は?数字も入れられるじゃねえか!殺すぞ!」
という声が聞こえてきます。殺さないで
この式はpvalueに100を入れているワケじゃありません
pvalueの頭に*がついていますね
これはポインタ変数の宣言の時に使った*とは別物なんです
宣言のときの*はポインタ変数を宣言しますよという印みたいなものです
*pvalue = 100のときの*は「間接参照演算子」と呼ばれるものです
意味としてはポインタが指し示すアドレスにアクセスを行うものだと思ってください
pvalueには関数を宣言する際にvalueのアドレスを渡していますよね
value「これ、僕が居る場所ね」→pvalue「おっけー☆」
見たいな感じで居場所を教えてあげています、これがアドレス
pvalue君はvalue君の居場所を覚えている状態です
で、この「間接参照演算子」というのを使うと
pvalue君が覚えている場所に直接ワープできるものだと思ってください
*pvalue = 100とやればvalue君に直接100を渡すことができるし
x = *pvalueとやればvalue君から直接教えてもらうこともできます
長くなりましたが、とりあえずここまで書きました
多分、あまり分かりやすくかけていないので
分からないことが有りましたら補足などで教えてください....
いえいえ
とてもわかりやすかったです!!
ポインタって結構初心者が躓きやすい場所と聞きました。
もし他にも注意点、躓きポイントがあったら教えてもらえると嬉しいです。(漠然としててスイマセン)
No.3
- 回答日時:
>もし他にも注意点、躓きポイントがあったら教えてもらえると嬉しいです
難しいですね
結局ポインタの感覚を理解できるかどうかの問題なので
確かにポインタはつまずきやすいのですが
ここがつまずくよ!!というのは個人的にはないんじゃないかなと思ってます
何でポインタが難しいかって
いきなりアドレスの概念が出てくるからだと思います
正直C言語を学ぶ上で最初にやるであろう、変数についての部分から
アドレスについて言及すれば大分違うと思うのですよね
先の回答で
int *pvalueは分かりにくい!
int* pvalueの方が好きだ!と言いましたが
実はint *pvalueと書くのにもちゃんと理由がありまして
int* a, b;
とこのように書きますとintのポインタ変数が2つ宣言されているように見えますが
実はbの方はただのint型です。
一行で2つのポインタ変数を宣言したい場合
int *a, *b;
と書く必要があります。
それを踏まえると変数名の方に*をつけるのもありっちゃありなんです
もはやC言語のポインタ構文は分かりづらいので、存在そのものがややこしいのです
まぁ、一行で複数の変数を宣言するかどうかは
軽く論争が起きそうな話題ではありますけど
私は好きではないので一行に1つの変数宣言をするようにしています
http://pg-kura.hatenablog.com/entry/20120611/133 …
個人的にはここの説明がとても分かりやすいのでおすすめです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
VC++6.0 MFC ダイアログバーを...
-
Run-Time Check Failure #3とい...
-
構造体とfscanf
-
基本アルゴリズムの『返す』の...
-
x64プログラムでアドレスが32bi...
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
C言語: ポインタ
-
fopne で失敗する原因
-
visual studioのエラーについて
-
popenした子プロセスのプロセス...
-
C++で関数ポインタから関数名を...
-
printfとscanfの違いって・・・
-
ExcelVBAでのkernel32(64bit)
-
PASCALとFARの意味
-
VB.NET DLL【API関数(コールバ...
-
C言語のポインタに直接アドレス...
-
参照型で受け取った引数をポイ...
-
お絵かきソフトにUNDO、REDOを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
Cで作成したDLL関数をVBから呼...
-
NULLとブランクの違い
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
-
【C言語】戻り値が構造体の関数
おすすめ情報