char**型のポインタ変数pを用いて動的に2次元配列的にメモリを確保してみよう💖

char** a; a=(int**)malloc(sizeof(char*)*2);の実行により8バイトメモリが確保されます そのメモリの先頭のアドレスはchar**型のポインタ変数aに格納されます

ソーラー「


では


char型の変数のアドレスを格納するchar*型のポインタ変数のアドレスを格納するchar**型のポインタ変数


を用いて


メモリを確保したいと思います」


solarplexuss「char**型のポインタ変数を使って


メモリを確保できるということなの?」


ソーラー「そうなんです


以前のエピソードで

malloc関数を用いてメモリを確保しましたね


たとえば


char* a;

a=(int*)malloc(sizeof(char)*2);


が実行されると


malloc(sizeof(char)*2)


により


2バイト分のメモリが確保されます


そのメモリの先頭のアドレスが


戻り値として


malloc(sizeof(char)*2)


に返されることになるのですが


malloc(sizeof(char)*2)をchar*型にキャストすることにより


char*型のポインタ変数aに確保したメモリの先頭のアドレスを代入することができます


このように

       💖アドレスが代入されたポインタ変数aを用いれば💖



char型の配列変数

a[0]

a[1]

を用いて

char型の配列変数

a[0]

a[1]

a[0]='a';

a[1]='b';

のように


文字データを格納することができるようになります


そのプログラムはこちらです

👇

#include <stdio.h>

#include <stdlib.h> /* malloc関数を用いるにはヘッダファイル<stdlib.h>をインクルードします*/


int main(void) {


char* a;


a = (char*)malloc(sizeof(char) * 2);


a[0] = 'a';

a[1] = 'b';



printf("%c\n", a[0]);

printf("%c\n", a[1]);


return 0;

}



ビルド実行結果

a

b


ソーラー「malloc関数を用いてメモリを2バイト確保することができましたね」


同様に


char**型のポインタ変数を使ってメモリを確保することができます



たとえば


char** a;

a=(char**)malloc(sizeof(char*)*2);


が実行されると


malloc(sizeof(char*)*2)


により

char*は4バイトのデータ格納容量を持つため


8バイト分のメモリが確保されます


そのメモリの先頭のアドレスが


戻り値として


malloc(sizeof(char*)*2)


に返されることになるのですが


malloc(sizeof(char*)*2)をchar**型にキャストすることにより


char**型のポインタ変数aに動的に確保したメモリの先頭のアドレスを代入することができます


aはchar**型のポインタ変数なのですが


ポインタ変数なので


          このように


   💖char**型のポインタ変数aにアドレスが代入されると💖



aに[]演算子を用いた


a[0]

a[1]

を生成しデータを代入することができます



aは


char型の変数のアドレスを格納するchar*型のポインタ変数のアドレスを格納するchar**型のポインタ変数


なのですが


この

配列変数

a[0]

a[1]

の先頭の配列変数

a[0]

のアドレスを格納しているポインタ変数であり


aにアスタリスク演算子*


を用いた


*a

配列変数

a[0]

のアクセスしているメモリにアクセスし


配列変数

a[0]

そのものを表すことになります


aは


char型の変数のアドレスを格納するchar*型のポインタ変数のアドレスを格納するchar**型のポインタ変数


ですが


*aは


char型の変数のアドレスを格納するchar*型のポインタ変数を表すことになります


この

a[0]

a[1]

char*型の配列変数なので


char*型の配列変数

a[0]

a[1]

には

文字データでなく


char型の変数のアドレスデータを格納することができます


そのプログラムはこちらです

👇

#include <stdio.h>

#include <stdlib.h> /* malloc関数を用いるにはヘッダファイル<stdlib.h>をインクルードします*/


int main(void) {


char** a;


a = (char**)malloc(sizeof(char*)*2);

//malloc関数を用いてメモリを8バイト分確保しています


char b=1;

char c=2;


a[0]=&b;

a[1]=&c;


printf("%p\n",a);

printf("%p\n",a[0]);

printf("%p\n",a[1]);

return 0;

}


ビルド実行結果

00715A08

006FFA4B

006FFA3F



ソーラー「malloc関数を用いてメモリを8バイト確保することができましたね」


このとき


char**型のポインタ変数

a

に格納されているアドレスは

00715A08


int*型のポインタ変数

a[0]

a[1]

に格納されているアドレスは

006FFA4B

006FFA3F


となっています


このように


char** a;


a = (char**)malloc(sizeof(char*)*2);


を実行した場合は


動的に確保したメモリに


char*型のポインタ変数である


配列変数

a[0]

a[1]

を用いて


char型の変数のアドレスを代入することができるというわけです」


アレサ「ということは


char*型のポインタ変数である


配列変数

a[0]

a[1]

には


文字データは代入できないということなのですの?」



ソーラー「そうなんです


そのことを示すプログラムはこちらです

👇


#include <stdio.h>

#include <stdlib.h> /* malloc関数を用いるにはヘッダファイル<stdlib.h>をインクルードします*/


int main(void) {


char** a;


a = (char**)malloc(sizeof(char*) * 2);

//malloc関数を用いてメモリを8バイト分確保しています


a[0] ='a';

a[1] = 'b';



printf("%p\n", a[0]);

printf("%p\n", a[1]);


return 0;

}


ビルド実行結果


エラー (アクティブ) E0513 型 "char" の値を型 "char *" のエンティティに割り当てることはできません

エラー (アクティブ) E0513 型 "char" の値を型 "char *" のエンティティに割り当てることはできません

エラー C2440 '=': 'char' から 'char *' に変換できません。

エラー C2440 '=': 'char' から 'char *' に変換できません。


solarplexuss「


ははあ なるほど~


型 "char" の値を型 "char *" のエンティティに割り当てることはできません



エンティティは実体という意味なんだけど


この場合は


型 "char" の値を型 "char *" の変数に割り当てることはできません


という意味なんです


char*型のポインタ変数である


配列変数

a[0]

a[1]

には


文字データ

'a'

'b'

は代入できないんだね」



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る