C言語初心者です。
よろしくお願い致します。
1 #include <stdio.h>
2
3 struct Animal {
4 int eyes;
5 double weight;
6 };
7
8 // 構造体のポインタ変数を引数に取る関数(2)
9 void func2(struct Animal* panimal) {
10 printf("func2: eyes[%d]\n", panimal->eyes);
11 printf("func2: weight[%f]\n", panimal->weight);
12 }
13
14 // 構造体のポインタ変数を引数に取る関数(1)
15 void func1(struct Animal* panimal) {
16 printf("func1: eyes[%d]\n", panimal->eyes);
17 printf("func1: weight[%f]\n", panimal->weight);
18 func2(panimal); // アドレス(ポインタ)を渡す
19 }
20
21 int main(void) {
22 struct Animal animal = { 2, 54.3 };
23
24 func1(&animal); // アドレス(ポインタ)を渡す
25 // eyes[2]
26 // weight[54.300000]
27
28 return 0;
29 }
(※参考)https://yu-nix.com/blog/2021/11/1/c-struct-point …
上記プログラムを実行すると、
func1: eyes[2]
func1: weight[54.300000]
func2: eyes[2]
func2: weight[54.300000]
画面表示されます。
18行 func2(panimal); の引数ですが、
もしも、引数に&を入力して
func2(&panimal);
とした場合でも、上記実行結果を得る方法はあるのでしょうか?
(構造体のポインタ変数)の&とは?
No.2
- 回答日時:
&変数 は、変数のアドレスを取得することを意味します。
24行目のfunc1(&animal);
はamimlのアドレス(=ポインター)を取得し、その値を引数として渡しています。
18行目でfunc2(&panimal);とすると
panimalのアドレスを取得します。panimalはポインターなので、
そのポインターのアドレスを渡すことになり、おかしくなります。
>もしも、引数に&を入力して
>func2(&panimal);
>とした場合でも、上記実行結果を得る方法はあるのでしょうか?
その場合、func2をポインターへのポインターが渡されるように変える必要があります。
下記がfunc2をそのように変えたサンプルです。(実用性はありません)
#include <stdio.h>
struct Animal {
int eyes;
double weight;
};
// 構造体のポインタ変数を引数に取る関数(2)
void func2(struct Animal** ppanimal) {
struct Animal* panimal = *ppanimal;
printf("func2: eyes[%d]\n", panimal->eyes);
printf("func2: weight[%f]\n", panimal->weight);
}
// 構造体のポインタ変数を引数に取る関数(1)
void func1(struct Animal* panimal) {
printf("func1: eyes[%d]\n", panimal->eyes);
printf("func1: weight[%f]\n", panimal->weight);
func2(&panimal); // アドレス(ポインタ)を渡す
}
int main(void) {
struct Animal animal = { 2, 54.3 };
func1(&animal); // アドレス(ポインタ)を渡す
// eyes[2]
// weight[54.300000]
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- 工学 Pythonの3次元描画に関する質問です 3 2022/12/07 20:07
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
fopne で失敗する原因
-
Cで作成したDLL関数をVBから呼...
-
入れ子の構造体について
-
ポインタについて
-
C言語の文字列?処理 strcpyやl...
-
連結リスト 要素の入れ替え
-
戻り値で構造体を返すことは可...
-
ハンドルはポインタか
-
[C言語] NULLは必ず0(番地)です...
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
C言語の勉強しています。すみま...
-
関数ポインタを返す関数の型をt...
-
コンストラクタでnewを失敗した...
-
自作DLLの引数について、ポイン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
構造体とfscanf
-
c言語で任意のファイルから読み...
-
デバイスハンドルとは?
-
main(int argc,char **argv[])...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
C言語の関数と配列に関する質問
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
おすすめ情報