.ProgExⅡ / ポインタ
導入
今まではポインタについては雰囲気で使っていた
おまじないとして,scanf("%d", &x);のような感じで&をつけていたと思う
これは何なのかという話
hr.icon
前提の確認
結局は全てメモリ上の0と1の記録にすぎない
ただし,コンピュータは1bitずつ扱うのではなくて,最小単位として1Byteごとに取り扱っている
1Byte = 8bitなので,つまり8桁の2進数$ 2^8 = 256通りの表現が可能
例えばAという文字は1Byteで表現される
ASCIIコードでは「65」という整数値
65を16進数で表現すると0x41
0x41は2進数で表現すると01000001
Aなのか65なのか"65"なのかという問題
型を意識しないと,自分が何を処理しているのかわからなくなるので注意
Aと65と"65"はメモリ空間上では全く異なる
'A'の場合
Aという文字はASCIIコードでは10進数で65という1Byteの整数
なのでchar c = 'A'でもchar c = 65 でも同義
つまり1Byteで01000001とメモリに格納されている
8bitを使用している
文字は所詮は1バイトの文字コードという整数値の変数なので以下は全く同じ
code:example.c
char c = 'A';
char c = 65;
65の場合
int型の65は65という数値
int型は一般的に4バイトなので32bit分を使用する
00000000 00000000 00000000 01000001 と記録されている
code:example.c
int x = 65;
"65"の場合
これは「6」と「5]という文字の列です.
文字列の場合には最後に「\0」というヌル文字が入っています
なので{'6', '5', '\0'}という1Byteの文字が3文字分メモリに格納されています
code:example.c
char str[] = "65";
ポインタの基本概念
1バイトごとにアドレスが割り当てられている
Macのように64bitのCPUの場合はアドレスは8バイト(64bit)で表現される
hr.icon
ポインタの定義・宣言
code:sample.c
int x = 10;
int *p = &x; // aのアドレスをpに格納
printf("%d\n", *p); // pが指す値を出力
printf("%p\n", p); // aのアドレスを出力
C言語のプリミティブな型
hr.icon
基本的な操作
code:example.c
int main() {
int x = 10;
printf("%d\n", x);
printf("%p\n", &x);
return 0;
}
code:task8-1.c
int main() {
char c = 'A';
printf("%c\n");
return 0;
}
hr.icon
配列とポインタ
hr.icon
文字列とポインタ
hr.icon
アドレス演算子
hr.icon
間接演算子
hr.icon
動的メモリ割り当て