私は現在C++のプログラミングを学習しています。
C++の教本(SoftbankCreative 高橋麻奈著 やさしいC++)
自体は読み終え、今現在別のプログラムの本を読んでいるのですが、
わからない表記があり、
またネットでどのように(何という名前で)検索していいかわからないのでこちらで質問させて頂きます。
(char* buffer などであれば「ポインタ」とかで検索すれば出るのですが…、char**のように2重になってるのは引っ掛かりませんでした。)
たとえば、
void readFile( char** buffer, int* size, const char* filename );
このような場合、
char** buffer はどういう事なのでしょうか?
この書き方の名前等はありますか?(char* buffer だと ポインタ のように)
あるいは、基本的なC++の本に載っている知識の組み合わせで理解できるものなのでしょうか?
ネットのC++勉強サイトや、ヒントでいいので教えて頂きたいです。
必要ないかもしれませんが、私がつまった所に関連するコードを載せておきます。
void readFile( char** buffer, int* size, const char* filename );
~~~
(mainLoop()という関数内)
const char* filename = "stageData.txt";
char* stageData;
int fileSize;
readFile( &stageData, &fileSize, filename );
~~~
void readFile( char** buffer, int* size, const char* filename ){
ifstream in( filename, ifstream::binary );
if ( !in ){
*buffer = 0;
*size = 0;
}else{
in.seekg( 0, ifstream::end );
*size = static_cast< int >( in.tellg() );
in.seekg( 0, ifstream::beg );
*buffer = new char[ *size ];
in.read( *buffer, *size );
}
}
途中で、
char* stageData;
とし、
readFile( &stageData,
のように放り込んでいるので、
ポインタのその更にポインタ、みたいな感じでしょうか?
であればあえて2重にする意味がよくわからないです。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
>ネットでどのように(何という名前で)検索していいかわからない
「ポインタのポインタ」で検索してみてください。
char*がcharのポインタなら
char**はchar*のポインタです。
>2重にする意味がよくわからないです。
ポインタのポインタを使う場面は色々あるのですが、
このvoid readFile( char** buffer, int* size, const char* filename )が
何故引数をchar**にしているのかについて説明します。
関数内で*buffer = new char[ *size ];
としている箇所がありますよね。これを関数の外で受け取る為にこのような宣言にしているのです。
要は中のnewで割り当てられたアドレスを外で受け取りたいわけです。
参考までに以下のようなソースを書いてみました。
#include <stdio.h>
void fnc1(char* buffer)
{
buffer = new char[100];
}
void fnc2(char** buffer)
{
*buffer = new char[100];
}
int main()
{
char* p1 = NULL;
fnc1(p1);
printf("p1=%x\n",p1); // これだと0(NULL)を渡しているだけなので中でnewで割り当てられたアドレスを受け取れない。
char* p2 = NULL;
fnc2(&p2);
printf("p2=%x\n",p2); // アドレスを入れるアドレスを渡しているので中でnewで割り当てられたアドレスを受け取れる。
return 0;
}
他にも
charの引数だけでは関数に1文字しか渡せませんが
char*で文字列(複数の文字)を渡せますよね?
つまりchar**は複数の文字列を渡せる事がわかると思います。
わかりやすい御説明ありがとうございます!
参考コードを書いていただき、良く理解できました。
ポインタのポインタで検索すれば良かったのですね。
これからも頑張って勉強していきます。
本当にありがとう御座いました!
No.3
- 回答日時:
別の、もう少し簡単な例を書いてみます。
int n = 10;
func(n);
と書いて、func関数にnの値10を渡します。このとき、
func関数で
void func(int n)
{
n *= 100;
}
のように、受け取った値をいくら加工しても、
呼び出し元のnの値には影響しませんね。
func関数でnに手を加えた結果を呼び出し元に反映させるときは
呼び出し元:
int n = 10;
func(&n);
func関数側:
void func(int *n)
{
*n *= 100;
}
と書けば、呼び出し元でfunc関数を呼び出した直後のnは1000になります。
考え方はこれと同じです。
No.2
- 回答日時:
>char** buffer はどういう事なのでしょうか?
char型のポインタへのポインタ、です。
もし、
char* stageData;
readFile( stageData, &fileSize, filename );
だったとします。第1引数に&が付いてないですね。そうすると、
readFile関数で
buffer = new char[ *size ];
と書いて領域を割り付けても、その結果を呼び出し元に反映しません。
readFile関数で領域を割り付けたりデータを読み込んだりした結果を
呼び出し元に反映させるため、ポインタへのポインタを使っています。
わかりやすい御説明ありがとうございます!
下のNO.3の簡単な説明もありがとうございます。
おかげさまで十分に理解出来たと思います。
本当にありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語のプログラムについてです
-
C言語にて構造体のメンバがNULL...
-
fstream型オブジェクトを関数の...
-
文字列str内の全ての数字を...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
CStringからchar*への型変換に...
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
文字列の途中から途中までを抽出
-
DWORDとcharの変換
-
c言語でポインタ変数を用いた配...
-
'\\0'とはなんですか?
-
fgetc( )の戻り値はなぜ整数??
-
ポインタのポインタの使い方
-
callocについて
-
文字型配列に格納した空白の切捨て
-
wsprintf( ポインタ , "%d" , "...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
C++17で、unsigned char * 配列...
-
文字列内の数字削除
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
C言語を用いた環境変数の作成/...
-
動的メモリの初期化方法について。
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
C言語:小文字を大文字に変換す...
おすすめ情報