参考にした本:粂井康孝『猫でもわかるC言語プログラミング 第3版』SB Creative
#後半
7.2:ポインタの基本
7.3:ポインタへの値の代入
7.4:ポインタと引数
##7.2:ポインタの基本(p155)
###定義
ポインタ:アドレスを格納するための変数
###性質
・一般の変数と同様に、使う前に宣言する。
・pi
は「int型へのポインタ」となる。 ex. int *pi
;
・*はポインタ宣言子という。(p153,4行目を訂正)
→***pi
はポインタ宣言子といわれる(*
単独で宣言子ではない)**
参照:宣言子の例
・よって,p
の型名はint*
であるが、文法上はint
という型指定子と*p
という宣言子で構成されることになる。
・scanf("%d", &a);
における&a
は、アドレスを教えて、関数を呼び出した側の変数にはなんの変化も起こらないようにする、安全装置の役割があった。
###コード
int a;
int *pa;
pa = &a;/*paはポインタで、aのアドレスが格納された*/
a
に値を代入する。*pa
は変数a
の値を表している.
int a,b;
int *pa;
a = 5
pa = &a;/*paはポインタで、aのアドレスが格納された*/
b = *pa;
POINT:基本的には普通の変数と同じで、宣言→代入の順番でよい。
##7.3:ポインタへの値の代入(p156)
###要点
・int a;
により,メモリ上のどこかに4バイト分の領域が確保される。
・a
のアドレスを100番地とすると,100番地から103番地までの4バイトがa
のために使える。
・pa=&a;
とすることでpa
に100が代入される。
・*pa
に5を代入するいうことは,100番地から103番地の4バイトの入れ物に5を代入することである。
###コード
*paに5に代入すれば,結果としてaに5を代入したことになる。
#include <stdio.h>
int main(){
int *pa;
int a;
pa = &a;/*aにアドレスを代入*/
*pa = 5;/*aのアドレスに5を入れる、*が必要*/
printf("*pa = %d\n", *pa);
printf("a = %d\n", a);
return 0;
}
実行結果
*pa = 5
a = 5
POINT:pa = &a;
でポインタを初期化すること。知らないアドレスに数値を入れない。
##7.4:ポインタと引数(p159)
###要点
参照呼び出し:関数内で仮引数の値を変更すれば、呼び出し元の実引数も変更される。
###コード(失敗例)
swap関数でa
とb
との値を入れ替えたい。(↓では入れ替えられない)
#include<stdio.h>
void swap(int, int);
int main()
{
int a, b;
a = 10;
b = 20;
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap(int a, int b)
{
int c;
c = b;
b = a;
a = c;
return;
}
実行結果(入れ替わってない)
a = 10, b = 20
原因:swap関数,main関数の変数は別物だから。
###コード(成功例)
・z
以外のswap関数内の変数をmain関数内の変数のアドレスの変更する。
・swap(&a, &b);
でmainの変数a
,b
のアドレスを教える。
#include<stdio.h>
void swap(int *, int *);
int main()
{
int a, b;
a = 10;
b = 20;
/*swap関数内に変数a,bのアドレスを教える*/
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap(int *x, int *y)
{
int z;/**はいらない*/
z = *y;
*y = *x;
*x = z;
return;
}
実行結果(成功。入れ替わった)
a = 20, b = 10