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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

3455閲覧

ポインタにポインタを代入。mainでは上手くいくが、関数に渡すと上手くいかない??

uv_oga

総合スコア1

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/05/05 08:51

発生している問題・エラーメッセージ

c言語初心者で、初めて質問します。 mydataの中身を書き換えようと思っています。 24行目のように、main関数の中で代入すると、mydata[1]の値は変わってくれます。 しかし、これをcng_str関数で行うと(34行目)、エラーは出ませんが、mydata[2]の値が 変わってくれません。 どうしてでしょうか? 8時間くらいあがいてますが、解決しません。 どうか、よろしくお願いいたします。

該当のソースコード

#include <stdio.h> 2 #include <string.h> 3 4 5 // ポインタ変数mydataに ポインタ変数cngを代入する関数 6 void cng_str(char *cng, char *mydata) { 7 mydata =cng; 8 } 9 10 11 int main(void){ 12 char *mydata[3] = {"non1","non2","non3"}; 13 char *cng = "cng"; 14 15 // mydataの確認 16 for(int i=0; i<3; i++) { 17 printf("%s, ", mydata[i]); 18 } 19 printf("\n"); 20 21 22 // main関数内でmydata[1]のアドレスに 23 //cngのアドレスを代入する 24 mydata[1] = cng; 25 26 for(int i=0; i<3; i++) { 27 printf("%s, ", mydata[i]); 28 } 29 printf("\n"); 30 31 32 //関数cng_strにcng, mudata[2]のアドレスを渡して 33 //mydata[2]のアドレスにcngのアドレスを代入する 34 cng_str(cng, mydata[2]); 35 36 for(int i=0; i<3; i++) { 37 printf("%s, ", mydata[i]); 38 } 39 printf("\n"); 40 41 42 43 return 0; 44 }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

呼び出している関数は、以下のものでしょうか?

C

1void cng_str(char *cng, char *mydata) { 2 mydata =cng; 3}

この関数に渡される cng と、mydata は、文字列へのアドレス(という数字)です。関数内で、変更された mydata の内容は、呼び出し元へは伝わりません。
(これが、*mydata = *cng だと、mydata の最初の一文字は変更される。)
この形式で、変更したいならば、以下のようにする必要があります。

C

1void cng_str(char **cng, char **mydata) { 2 *mydata = *cng; 3}

そして呼び出し側は、文字列のアドレスのアドレスを渡す必要があり、

C

1 cng_str(&cng, &mydata[2]);

となります。

投稿2020/05/05 09:06

pepperleaf

総合スコア6385

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

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

SHOMI

2020/05/05 09:18

cngはcng_str()内では変更しないのでダブルポインタにする必要はありませんよね。 質問者がC言語初心者とのことなので、ポインタを関数に渡す場合はダブルポインタで渡すものだと誤解されないよう念のため指摘させていただきます。
pepperleaf

2020/05/05 09:30

> cngはcng_str()内では変更しないのでダブルポインタにする必要はありませんよね その通りですが、形式を揃えてしまいました。 この手のポインタの説明は難しいです。
SHOMI

2020/05/05 09:33

ポインタの説明は文章だけではなかなか伝わりづらいですよね…
uv_oga

2020/05/05 21:26

おかげさまで、解決しました。 ポインタについて、勉強足りませんでした。 本当にありがとうございました。
guest

0

ベストアンサー

ポインタの値渡しとなっているため、呼び元の値は書き換わりません。

C

1void func(int a) 2{ 3 a = 0; 4} 5int main() 6{ 7 int A = 1; 8 func(A); 9 printf("%d\n", A); 10 return 0; 11}

としてもAが書き換わらないのと同様です。

呼び元のポインタ値を書き換えたいのであれば、以下のようにポインタのポインタでわたします。

C

1void cng_str(char* cng, char** mydata) { 2 *mydata = cng; 3} 4 5() 6 7 cng_str(cng, &mydata[2]);

投稿2020/05/05 09:03

編集2020/05/05 09:06
SHOMI

総合スコア4079

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

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

uv_oga

2020/05/05 21:22

迅速なアドバイスありがとうございました。 おかげさまで、解決しました。 長時間悩みましたが、自分が無知なだけでした。 ダブルポインタはこういう時に使うんですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問