天国にいけるC言語入門 ヘキサ構造体 ver2.2126
char** a; a=(int**)malloc(sizeof(char*)*2);の実行により8バイトメモリが確保されます そのメモリの先頭のアドレスはchar**型のポインタ変数aに格納されます
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'
は代入できないんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます