
No.4ベストアンサー
- 回答日時:
例えば次のようにサーチして調べて下さい。
C言語 "ポインタへのポインタ"
C言語 仕様 ポインタ引数
次等が参考になると思います。
http://www.geocities.jp/debu0510/personal/c_poin …
C言語:ポインタ入門
>ポインタへのポインタ
>char **cpp;とかいうやつです。cppはcharへのポインタを指します。 int **ipp;ならintへのポインタを指します。
>ポインタへのポインタを使うと、 ポインタを参照渡しごっこすることが可能です。 関数内で指す場所を変えることが出来るのです
........
No.3
- 回答日時:
誰しも、高水準な言語から、アドレスを直接意識しなければならない低水準な言語を学習する場合、少なからず混乱してしまうものです。
ご質問の内容からは離れますが、私自身の経験から「誰かがそう言ってくれたら直ぐにポインターが理解できたのに」と思う要点がありますので、ご紹介します。まず、生成されるEXEやDLL内にソースコード中の変数名は存在しません。したがって、総ての変数はあるアドレスに値を格納するという表現がなされています。動作を構造化して管理しやすくする為に関数という書き方が存在する訳ですが、コンパイラにとっては厄介な仕事が一つ増えることになります。引数がvoid func(int a, int b)と記述された場合、呼び出し側の変数値を一旦別なアドレスへコピーして渡さなければならないからです。
これをコンパイラ側に優しい書き方にしたのが、アドレス渡しです。関数側はvoid func(int *a, int *b)という表現になりますし、呼び出し側に実体変数がある場合は、アドレスを渡しますのでfunc(&a, &b);になります。この場合コピーが発生しませんから、動作も高速になりますが、同じアドレスを参照していますから、変数に対する値の代入は呼び出し元へも影響を与えることに注意が必要です。
関数Aの引数がアドレス表記なら、関数スコープ中の変数はアドレスが格納された変数(ポインター)ですから、ご存知のとおり値を代入する場合 *a = 10;が必要になり、そこから更に呼び出す関数Bの引数がアドレスならそのまま渡せることになります。
もし、ご質問された方がMicrosoft Visual Studioのようにグラフィカルなデバッグ環境をお持ちでしたら、任意な行にF9でブレイクポイントを置き、クイックウォッチで変数がどのアドレスにどう格納されているのかを眺めることができますので、ぜひ一度ご覧になってください。
ご質問にお答えするような内容になっていませんでしたら、ご容赦ください。今後のご発展をお祈り申し上げます。
No.2
- 回答日時:
言ってる意味が良く分かりませんね。
一つ目の質問は、良く分からないのですが、
関数Bでメイン関数で宣言した数値を変更したいとかそういう話でしょうか?
int 関数A(int *a,int *b)
{
*a = 5;
*b = 3;
関数B(a,b)
}
で、出来ます。
関数Bも同様にint 関数B(int *a,int *b)としてください。
このa,bは元々アドレスを格納してあるのでそのまま渡して問題ありません。
int *aとして宣言した場合の例として、
*a・・・指定されたアドレス先の中身
a ・・・アドレス
&a・・・アドレスのアドレス
となります。&aはint a[2][2]みたいな多次元配列を扱うときに使いますが、この場合はあまり関係ありません。
2つ目の質問ですが、やることは出来ます。一応。
多分考えているような動きはしてくれませんが。
関数Aの時点でメインから変数x,yを受け取ったとしましょう。
そのときa,bには、
a=xのアドレス
b=yのアドレス
が、格納されています。
これをa=5;やb=3;としてしまうと、元の値を参照できなくなってしまいます。
また、メモリ上ではどこに何が格納されているか分かりません。
a=5;としてしまうと他のプログラムに悪影響を及ぼす可能性もあります。
やるのであれば、メモリを確保するmallocやnewなどと併せて使うのが割と一般的かと思います。
No.1
- 回答日時:
えーと、イメージのコードは C の構文としていろいろ抜けていますが、関数A(int *a, int *b) と 関数B(int *a, int *b) があって、関数A から 関数B を呼び出したい、ということでよろしいでしょうか。
ならば、
int 関数A(int *a, int *b)
{
*a = 5;
*b = 3;
関数B(a, b)
}
となります。
また、
> ポインタ引数の関数内で、
> ポインタ指定せずに変数を使えるのでしょうか?
について。
使えますが、あなたが思っているような動作にはなりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、写真のプログラムをどう直せ 2 2022/07/09 21:13
- C言語・C++・C# C言語で構造体の参照渡しができません 2 2022/12/18 21:22
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
c言語で任意のファイルから読み...
-
ExcelVBAでのkernel32(64bit)
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
C言語のポインタに直接アドレス...
-
VC6.0で作ったライブラリをVBで...
-
VC++でmciSendString
-
アプリを32bitから64bit移行
-
sizeofについて
-
VC++6.0 MFC ダイアログバーを...
-
【C言語】戻り値が構造体の関数
-
NULLポインタが0でない処理系と...
-
パスからファイル名を抽出
-
#define NULL ((void *)0) の弊害
-
デバイスハンドルとは?
-
VB6でポインタ?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
プーさんのマウスポインタを教...
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
自作DLLの引数について、ポイン...
-
NULLポインタが0でない処理系と...
-
TCHAR文字列内の検索について
おすすめ情報