メモリとポインタ:何を指しているの?
ポインタを関数に渡さないと値の書き換えはできない
配列変数はポインタににている
しかし、配列変数は完全なポインタではない
sizeof(配列)は配列のサイズ
配列sのアドレス&sは&s == s
配列変数は他の場所を指すことはできない
配列変数をポインタに渡すと格下げされる
code:lethal.c
int doses[] = {1, 3, 2, 1000};
printf("give &i", 3doses); code: array.c
int drinks[] = {4, 2, 3};
// drinks0 と *drinksは同じ意味になる // drinks2 と *(drinks + 2)も同じ意味 ポインタが単なるメモリアドレスなら、なぜポインタは型を持つのか?
ポインタ演算は内密に行われ、ポインタ演算によって実際にシフトするバイト数を決める必要があるため
データ入力でのポインタの利用
char name[40]; scanf("%39s", name); int age; scanf("%i", &age);のように使える
scanf()には注意
char food[5]; scanf("%s", food);これはバッファオーバーフローを起こす恐れがある fgets()がscanf()の代わりになる
char food[5]; fgets(food, sizeof(food), stdin);のように使う。第二引数は\0を含む文字列サイズを入れる
scanf()が優れてるのは複数フィールドの入力が可能な点で、安全性と空白の扱いはfgets()が優れている
文字列リテラルは決して書き換えられない
char *cards = "JQK";を書き換えようとするとbus errorなどが起きる
const char *s = "JQK"などとしておけば書き換えはコンパイルエラーになってくれる
文字列を変更する場合はコピーする
char cards[] = "JQK";とすれば、文字列リテラルの新たなコピーを含む配列ができ、書き換えられる
配列を宣言しているのでスタック領域に新しい配列が作成され、文字列リテラルの内容がそこにコピーされる Cツールボックス
ややこしいところ
char cards[]の意味
通常の変数宣言の場合はcardsが配列であることを意味する
関数引数として宣言されている場合はcardsがポインタであることを意味する
void stack_deck(char cards[])のcardsは配列変数ではなくポインタ
は?
だからsizeofの結果も4とか8になっていた