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

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

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

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

Q&A

解決済

2回答

959閲覧

c言語 ポインターについて

maikel

総合スコア61

C

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

0グッド

0クリップ

投稿2018/05/01 14:10

void func6(char **str){
str = (char)malloc(sizeof(char)*6);
*str = "func6";
}

このポインターを使ったメソッドなのですが、説明ではcharのポインター型のアドレスは関数の呼び出し元と関数内では異なると受けたのですが、どうも意味合いが分かりません。もう少し詳しめの説明となぜ、**strなのか教えてもらえないでしょうか。

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

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

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

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

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

guest

回答2

0

mallocしてる領域が全く無駄になってますね。これ


なぜ、**strなのか

アドレスをそこで返すから。
ポインタのアドレスを引数として、ポインタの値をそこに代入して返してます

投稿2018/05/01 14:18

編集2018/05/01 14:21
y_waiwai

総合スコア87749

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

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

0

ベストアンサー

詳しくわかりやすく書きます。


ポインタの基礎

  • Integer型変数iを定義
  • そしてInteger型変数 i のアドレスを記憶するPointを定義

int i;
int *Point;

ここで

普通のポインタ

  int *Point;

Integer型変数のアドレスを記憶できるポインタ変数
を表す

ポインタ変数のポインタ変数

  int **Point;

とする事によって

Integer型変数のアドレスを記憶できるポインタ変数の
アドレスを記憶できるポインタ変数

になります。

続いて

質問の関数の処理の解説


C

1void func6(char **str){ 2*str = (char*)malloc(sizeof(char)*6); 3*str = "func6"; 4}

それぞれ順に見ていくとわかります。

char **str

void func6(char **str)

sizeof(char)*6;     char型のサイズ×6のサイズ

malloc(sizeof(char)*6);    char型のサイズ×6のサイズ分だけメモリ領域確保

(char*)malloc(sizeof(char)*6); (≠mallocのサイズではなく)
メモリ領域確保された「char型」配列のアドレス

そして

str = (char)malloc(sizeof(char)*6); *str は「char型」配列のアドレス

*str = "func6";   *strを先頭アドレスとして ’/n’を配列末尾に含む、固定長6の文字列が代入

結果として 

charのポインター型のアドレスは関数の呼び出し元と関数内では異なる

char **str と
str = (char)malloc(sizeof(char)*6);

この2つの*strは違うことになります。

投稿2018/05/01 15:18

kawakawa2018

総合スコア1195

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

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

kawakawa2018

2018/05/01 15:22

char **str = (char *)*str のイメージ あっているかな? Cに詳しい方、解説お願いします。。。
maikel

2018/05/01 16:51

そのイメージが一番分かり易いかったです。
maikel

2018/05/01 16:53

ありがとうございます。フォローしました。もしよければ、また見に来てくれると嬉しいです♪
kawakawa2018

2018/05/01 17:25

夜遅くにコメントありがとうございます。 GW中なのに熱心ですね。 char **str = (char *)*str のイメージ これを先に書いておけばよかったのですが 先に詳しい説明を書いてて 力尽きましたね。 C言語はもう10年くらいですか・・・ 使っていません。 先日じゃんけんゲームの質問に 回答したのが久々ですね。 makeの書き方も忘れましたが ポインタの仕組みと役割は 覚えていますね。 こちらもフォローしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問