天国にいけるC言語入門 ヘキサ構造体 ver2.2126
sizeof演算子はキャラアスタリスク型char*に作用することができsizeof(char*)は4を表します つまりchar*は4バイトのデータ格納容量をもちます
sizeof演算子はキャラアスタリスク型char*に作用することができsizeof(char*)は4を表します つまりchar*は4バイトのデータ格納容量をもちます
ソーラー「それでは
p = (char *)malloc(sizeof(char) * 100);
を
p = (char *)malloc(100);
と記述しても
ちゃんとプログラムを実行できたところで
お昼にしようかな・・・😊」
ソーラー「それでは午後のこの時間では
char*p;
p = (char *)malloc(sizeof(char*) * 100);
を実行した場合
何バイト分のメモリが確保されることになるか考察してみたいと思います
solarplexuss「
char*p;
p = (char *)malloc(sizeof(char*) * 100);
???
さっきは
char*p;
p = (char *)malloc(sizeof(char) * 100);
を実行したよね
今度は
char*p;
p = (char *)malloc(sizeof(char*) * 100);
を実行するの?
さっきの
char*p;
p = (char *)malloc(sizeof(char) * 100);
と何がちがうのかな?
アレサ「
今回
実行する
char*p;
p = (char *)malloc(sizeof(char*) * 100);
では
malloc関数の引数が
sizeof(char) * 100
でなく
sizeof(char*) * 100
になっています」
solarplexuss「あっほんとうだ
sizeof(char*) * 100??
なんじゃらほい?」
アレサ「
sizeof(char) * 100
では()の中に変数の型char
が用いられていますが
sizeof(char*) * 100
では()の中に変数の型char*
が用いられています
これは、どういうことなのでしょうか?」
ソーラー「やあっぱしそう思う😊
sizeof(char*) * 100
()の中にキャラアスタリスク型char*が用いられている
sizeof(char*) * 100
は
一体何を意味しているのか?
sizeof(char*) * 100
のように
sizeof演算子はそもそもchar*に作用することができるのかということですね
sizeof演算子とは
変数の型が何バイトのデータ格納容量を持つかを
示すことができます
char型は1バイトのデータ格納容量をもつので
sizeof(char)は1
をあらわします
int型は4バイトのデータ格納容量をもつので
sizeof(int)は4
をあらわします
float型は4バイトのデータ格納容量をもつので
sizeof(float)は4
をあらわします
float型は8バイトのデータ格納容量をもつので
sizeof(double)は8を表します
キャラアスタリスク型char*は
char* a;
の実行により
char*型のポインタ変数aを生成することができ
char*型のポインタ変数aには
char型の変数のアドレスを格納することができました
char*型を用いればメモリにアドレスを格納することができるというわけです
つまり
キャラアスタリスク型char*は
char型の変数のアドレスというデータを格納できる型なので
データ格納容量がある
となれば
char*型にsizeof演算子を作用させた
sizeof(char*)
は
char*型のデータ格納容量を示すというわけです」
solarplexuss「なるほど
char*型にはアドレスデータを格納できるデータ格納容量があるわけなのか
じゃあ
char*型のデータ格納容量って何バイトになるのかな?」
ソーラー「では
実際に
printf("%d\n", sizeof(char*));
を実行して
char*型のデータ格納容量が何バイトなのかを調べてみようかな
そのプログラムはこちらです」
👇
#include <stdio.h>
int main(void) {
printf("%d\n", sizeof(char*));
return 0;
}
ビルド実行結果
4
アレサ「4が表示されました
char*型のデータ格納容量は4バイトなのですね」
solarplexuss「4!
がでたっちゃ
はは~ん
char*型のデータ格納容量は4バイトなのか~
初めて知ったっちゃ💖
でも
なんでchar*型のデータ格納容量は4バイトなのかな?
ちょっとこのプログラムをみたっちゃ
👇
#include <stdio.h>
int main(void) {
char a;
char* b;
b = &a;
printf("%p\n",b);
return 0;
ビルド実行結果
010FFEE7
solarplexuss「このプログラムのように
4バイトのデータ格納容量を持つchar*型のポインタ変数bを用いれば
メモリに
char型の変数aのアドレス&aを格納できる
ということは
char型の変数aのアドレスは
4バイトのデータ量をもつってこと?なのかな?
どう?」
ソーラー「OH!~イエ~ス
そうなんです
次のプログラムをご覧ください
👇
#include <stdio.h>
int main(void) {
char a;
printf("%p\n",&a);
return 0;
}
ビルド実行結果
0073FCDF
solarplexuss「なんかプログラムが短くなった!」
ソーラー「このプログラムでは
char型の変数aのアドレス
0073FCDF
が表示されています
ということは
0073FCDF
というデータがメモリに格納されているというわけです
この
0073FCDF
は
コンピュータのメモリには0と1で
0000 0000 0101 0011 1111 1100 1101 1111
と格納されています
😊 😊 😊 😊 😊 😊 😊
0073FCDF
の
0
0
7
3
F
C
D
F
は
16進数であり
2進数では
それぞれ
0000
0000
0101
0011
1111
1100
1101
1111
と表されます
😊 😊 😊 😊 😊 😊 😊
0と1は
それぞれ1ビットのメモリのお部屋に格納されているので
0000 0000 0101 0011 1111 1100 1101 1111
は
32ビットのお部屋
つまり
4バイトのお部屋に格納されていることになります
つまり
アドレスデータは
4バイトのデータ量をもつので
アドレスデータをメモリに格納することのできる
キャラアスタリスク型char*は4バイトのデータ格納容量をもつというわけなんです」
solarplexuss「そっか
アドレスもメモリに格納されているんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます