天国にいけるC言語入門 ヘキサ構造体 ver2.2126
int **a; a=(int**)malloc(sizeof(int*)*2);が実行されると8バイト分メモリが確保されます そのメモリの先頭のアドレスはint**型のポインタ変数aに格納されます
int**型のポインタ変数pを用いて動的に2次元配列的にメモリを確保してみよう💖
int **a; a=(int**)malloc(sizeof(int*)*2);が実行されると8バイト分メモリが確保されます そのメモリの先頭のアドレスはint**型のポインタ変数aに格納されます
ソーラー「
では
int型の変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数
を用いて
メモリを確保したいと思います」
solarplexuss「int**型のポインタ変数を使って
メモリを確保できるということですかいの?」
ソーラー「そうなんです
以前のエピソードで
malloc関数を用いてメモリを確保しましたね
たとえば
int* a;
a=(int*)malloc(sizeof(int)*2);
が実行されると
malloc(sizeof(int)*2)
により
8バイト分のメモリが確保されます
そのメモリの先頭のアドレスが
戻り値として
malloc(sizeof(int)*2)
に返されることになるのですが
malloc(sizeof(int)*2)をint*型にキャストすることにより
int*型のポインタ変数aに確保したメモリの先頭のアドレスを代入することができます
このように
💖アドレスが代入されたポインタ変数aを用いれば💖
int型の配列変数
a[0]
a[1]
を用いて
int型の配列変数
a[0]
a[1]
に
a[0]=1;
a[1]=2;
のように
数値データを格納することができるようになります
そのプログラムはこちらです
👇
#include <stdio.h>
#include <stdlib.h> /* malloc関数を用いるにはヘッダファイル<stdlib.h>をインクルードします*/
int main(void) {
int* a;
a = (int*)malloc(sizeof(int)*2);
a[0]=1;
a[1]=2;
printf("%d\n",a[0]);
printf("%d\n",a[1]);
return 0;
}
ビルド実行結果
1
2
ソーラー「malloc関数を用いてメモリを8バイト確保することができましたね」
同様に
int**型のポインタ変数を使ってメモリを確保することができます
たとえば
int** a;
a=(int**)malloc(sizeof(int*)*2);
が実行されると
malloc(sizeof(int*)*2)
により
int*は4バイトのデータ格納容量を持つため
8バイト分のメモリが確保されます
そのメモリの先頭のアドレスが
戻り値として
malloc(sizeof(int*)*2)
に返されることになるのですが
malloc(sizeof(int*)*2)をint**型にキャストすることにより
int**型のポインタ変数aに確保したメモリの先頭のアドレスを代入することができます
aはint**型のポインタ変数なのですが
ポインタ変数なので
このように
💖int**型のポインタ変数aにアドレスが代入されると💖
aに[]演算子を用いた
a[0]
a[1]
を生成しデータを代入することができます
aは
int型の変数のアドレスを格納するint*型のポインタ変数のアドレスを格納するint**型のポインタ変数
なのですが
この
配列変数
a[0]
a[1]
の先頭の配列変数
a[0]
のアドレスを格納しているポインタ変数であり
aにアスタリスク演算子*
を用いた
*a
は
配列変数
a[0]
のアクセスしているメモリにアクセスし
配列変数
a[0]
そのものを表すことになります
aは
int型の変数のアドレスを格納するint*型のポインタ変数のアドレスを格納するint**型のポインタ変数
ですが
*aは
int型の変数のアドレスを格納するint*型のポインタ変数を表すことになります
この
a[0]
a[1]
は
int*型の配列変数なので
int*型の配列変数
a[0]
a[1]
には
数値データでなく
アドレスデータを格納することができます
そのプログラムはこちらです
👇
#include <stdio.h>
#include <stdlib.h> /* malloc関数を用いるにはヘッダファイル<stdlib.h>をインクルードします*/
int main(void) {
int** a;
a = (int**)malloc(sizeof(int*)*2);
//malloc関数を用いてメモリを8バイト分確保しています
int b=1;
int c=2;
a[0]=&b;
a[1]=&c;
printf("%p\n",a);
printf("%p\n",a[0]);
printf("%p\n",a[1]);
return 0;
}
ビルド実行結果
00F35A08
00EFFDB8
00EFFDAC
ソーラー「malloc関数を用いてメモリを8バイト確保することができましたね」
このとき
int**型のポインタ変数
a
に格納されているアドレスは
00F35A08
int*型のポインタ変数
a[0]
a[1]
に格納されているアドレスは
00EFFDB8
00EFFDAC
となっています
このように
int** a;
a = (int**)malloc(sizeof(int*)*2);
を実行した場合は
動的に確保したメモリに
int*型のポインタ変数である
配列変数
a[0]
a[1]
を用いて
アドレスを代入することができるというわけです」
アレサ「ということは
int*型のポインタ変数である
配列変数
a[0]
a[1]
には
数値データは代入できないということなのですの?」
ソーラー「そうなんです
そのことを示すプログラムはこちらです
👇
#include <stdio.h>
#include <stdlib.h> /* malloc関数を用いるにはヘッダファイル<stdlib.h>をインクルードします*/
int main(void) {
int** a;
a = (int**)malloc(sizeof(int*) * 2);
//malloc関数を用いてメモリを8バイト分確保しています
a[0] = 1;
a[1] = 2;
printf("%p\n", a);
printf("%p\n", a[0]);
printf("%p\n", a[1]);
return 0;
}
ビルド実行結果
エラー (アクティブ) E0513 型 "int" の値を型 "int *" のエンティティに割り当てることはできません
エラー (アクティブ) E0513 型 "int" の値を型 "int *" のエンティティに割り当てることはできません
エラー C2440 '=': 'int' から 'int *' に変換できません。
エラー C2440 '=': 'int' から 'int *' に変換できません。
solarplexuss「
ははあ なるほど~
型 "int" の値を型 "int *" のエンティティに割り当てることはできません
か
エンティティは実体という意味なんだけど
この場合は
型 "int" の値を型 "int *" の変数に割り当てることはできません
という意味なんです
int*型のポインタ変数である
配列変数
a[0]
a[1]
には
数値データ
1
2
は代入できないんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます