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

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

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

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

Q&A

解決済

3回答

671閲覧

関数内で、引数でわたしたポインタへアドレス代入する方法

hikaru1196

総合スコア21

C

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

0グッド

0クリップ

投稿2021/07/31 06:47

編集2021/07/31 09:23

C

1#include <stdio.h> 2int ga_test[100] = {1}; 3 4void test(int* a_test) 5{ 6 printf("2 : %p\n", a_test); 7 a_test = ga_test; 8 printf("3 : %p\n", a_test); 9} 10int main(int argc, char* argv[]) 11{ 12 int a_test[100] = {0}; 13 14 printf("1 : %p\n", a_test); 15 test(a_test); 16 printf("4 : %p\n", a_test); 17 18 return 0; 19}

上記の実行結果が以下となり、test()関数内の a_test = ga_test1; の箇所で代入したアドレスが関数を抜けると元のアドレスに戻っています(そもそも書き換えられていない?)。

実行結果 1 : 00CFFAB8 2 : 00CFFAB8 3 : 00738130 4 : 00CFFAB8

代入したアドレスを関数を抜けた後も使用できるようにする方法はあるでしょうか。


追記
※実現したいことの意図がわかりづらかったので、ソースコードを修正しました。

C

1#include <stdio.h> 2 3int ga_test1[100] = {1}; 4int ga_test2[100] = {2}; 5int ga_test3[100] = {3}; 6 7void SetTestData(int* a_test, int flg) 8{ 9 printf("2 : %p\n", a_test); 10 if(flg == 1){ 11 a_test = ga_test1; 12 } else if(flg == 2) { 13 a_test = ga_test2; 14 } 15 printf("3 : %p\n", a_test); 16} 17 18int main(int argc, char* argv[]) 19{ 20 int* a_test = NULL; 21 int flg = 1; 22 23 // flgを更新する処理 24 25 printf("1 : %p\n", a_test); 26 SetTestData(a_test, flg); 27 printf("4 : %p\n", a_test); 28 29 // テスト 30 31 return 0; 32}
実行結果 1 : 00000000 2 : 00000000 3 : 00F08190 4 : 00000000

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

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

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

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

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

guest

回答3

0

代入したアドレスを関数を抜けた後も使用できるようにする方法はあるでしょうか。

意図自体が意味不明です。

main内でのa_testは配列である以上、そのアドレスは定数であって、書き換える余地はありません。

投稿2021/07/31 06:49

maisumakun

総合スコア145208

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

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

hikaru1196

2021/07/31 07:09

仰る通り、意図がわかりづらかったので、ソースコードを修正しました。 やりたいことは、テスト用データ配列の作成です。 グローバルで定義しておいたテストデータ用の配列のアドレスを、SetTestData()関数の中でa_testに代入して、その後のテストで使いたいという意図になります。
guest

0

引数をポインタの参照にすれば良いかと思います。

c++

1void SetTestData(int*& a_test, int flg)

または意図を明確にするためポインタのポインタにするのも良いかと思います。

c++

1void SetTestData(int** a_test, int flg)

この場合は受け取りと呼び出しは下記のようにします。

c++

1*a_test = ga_test1; 2*a_test = ga_test2;

c++

1SetTestData(&a_test, flg);

投稿2021/07/31 07:57

Serbonis

総合スコア581

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

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

Serbonis

2021/07/31 08:19

質問はc言語でしたので参照は使えないですね。すいません
hikaru1196

2021/07/31 09:14

void SetTestData(int** a_test, int flg) こちらのようにダブルポインタで渡すことでやりたいことが実現できました! 解決済みにも関わらず回答下さりありがとうございます!!
guest

0

ベストアンサー

関数が引数でポインタを渡された場合、
そのポインタの指す呼び出し元のオブジェクトの値を変更できます。
関数test の 引数a_test は、main の配列 a_test を指していますから、
main の a_test[0]~a_test[99] の値を参照したり、変更したりできます。

C

1 a_test[0] = ga_test[0]; 2 a_test[1] = ga_test[1];

a_test = ga_test; を実行しても、
test の a_test がグローバルな配列 ga_test を指すだけで、
main の a_test は変更できません。
main の a_test は配列の先頭アドレスなので変更できません。

追記

代入したアドレスを関数を抜けた後も使用できるようにする方法はあるでしょうか。

diff

1-void SetTestData(int* a_test, int flg) 2+void SetTestData(int** a_test, int flg) 3 4- a_test = ga_test1; 5+ *a_test = ga_test1; 6 7- a_test = ga_test2; 8+ *a_test = ga_test2; 9 10- SetTestData(a_test, flg); 11+ SetTestData(&a_test, flg);

投稿2021/07/31 07:09

編集2021/07/31 07:58
kazuma-s

総合スコア8224

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

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

kazuma-s

2021/07/31 07:46

回答が付いた後に質問のコードを修正したら、回答が意味不明になってしまいます。 コードは変更ではなく、追記にしてください。 質問の編集をお願いします。
hikaru1196

2021/07/31 09:24

追記ありがとうございます。 そちらの方法でやりたいことを実現することができました。 また、ご指摘ありがとうございます。 コードを上書き修正するのではなく、追記するよう修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問