C言語講座 第3回 ポインタ、配列
ポインタとは 変数のメモリ上のアドレスを格 納するもの。 アドレスとは 【名詞】address : 住所, あて名, 所番地 メモリ上の場所のこと。
ポインタの使い方・書き方 #include <stdio.h> int main(){ } int a=3; int* pa;//ポインタpaを宣言 pa=&a;//ポインタpaにaのアドレスを格納 printf(“aの値は %d \n”,*pa);//paが指しているもの(a)の中身を表示 Printf(“aのアドレス(pa)は %d \n\n”,pa);//指しているもののアドレスを表示 return 0; }
ポインタの使い方・書き方 int* ポインタ変数名 int型ポインタ変数の宣言 &変数名 変数のアドレスを表す & : アドレス演算子
*の使い方 ・・・ a pa メモリ ↓aのアドレスを持っている paの中に入っている アドレス先(a)を見る printf(aの値は %d \n",*pa); ・・・ a pa
次に *pa = 7; printf("paが指しているものの中身は %d \n\n“, a); を追加すると
scanfについて scanf関数も 今まで使っていたこの&はaのアドレスを渡していたと いうことになります。 int a; scanf(“%d” ,&a ); 今まで使っていたこの&はaのアドレスを渡していたと いうことになります。 scanf関数は “アドレスが示す場所” を入力された値に 書き換える関数だったと分かります。
*の使い方 つまり、 *ポインタ変数 はアドレスの先の中身を表す ポインタ変数を使うことで間接的に値を変えることがで きる。 ということです
なぜポインタを使うのか aの値を変えたいのであれば直接変え ればいいのでは?と思うかもしれませ んが関数へ“アドレス渡し”する時に役 に立ちます。(これは次回やります)
ポインタまとめ int* ポインタ変数名 int型のポインタ 変数の宣言 &変数名 変数のアドレスを表す &変数名 変数のアドレスを表す *ポインタ変数名 ポインタ変数の先 の中身を表す ポインタを使うことでより動作の軽いプログラムを作るこ とができる
以上を踏まえて 配列を導入していきます!
配列とポインター int number[]={0,1,2}; main文の中に上のように配列を定義する。 ここでのnumberは&number[0]同じになります なのでprintf(“%d”,*number) とprintf(“%d”,number[0])は同じものを表現していること になります。 ・
・・・さらに 先程の printf(“%d\n”,*number); の下に printf(“%d\n”,*(number+1)); と入力すると Printf(“%d\n”,number[1]);とおなじものをあらわしている ことになります。
配列を用いたポインタ a[b]=*(a+b)
このような実行結果になるようにしてください 演習問題1 5つのint型要素(50,20,35,68,75) をもつ配列をつくり、最大値を出 力するコードを書いてください ※配列の要素はキーボードの標準 入力を用いてください このような実行結果になるようにしてください
演習問題1 解答例 #include<stdio.h> int main(){ int a[5]; 演習問題1 解答例 #include<stdio.h> int main(){ int a[5]; int max; printf("5つの数を入力してください\n"); for (int i = 0; i < 5; i++) { scanf("%d",&a[i]); } max = a[0]; for (int i = 0; i < 5; i++) { if (max < a[i]) max = a[i]; } printf("最大値は%dです\n", max); return 0;
演習問題2 配列v[]に{5,3,9,8,2,6,3,2}をセットする.要 素値がd(の値)の倍数であるものについて, それらの総和および総積を表示してください. なお,int型変数dの値はキーボード(標準入 力)から読み込んでください.
演習問題2 解答例 #include<stdio.h> int main(){ sum += a[i]; int a[] = {5,3,9,8,2,6,3,2}; seki *= a[i]; int sum=0,d,seki=1; } printf("dを入力してください\n"); scanf("%d", &d); printf("総和は%dです\n総積は%d です\n", sum,seki); for (int i = 0; i < 8; i++) { if (a[i] % d == 0)
演習3 (時間余った人用) 3次元ベクトルv={3,4,5}とx={1,2,3}を定義する。 これをポインタpv,pxを用いてベクトルv-xの距離をもとめよ。
演習3 解答例 #include <stdio.h> #include <math.h> main(){ 演習3 解答例 #include <stdio.h> #include <math.h> main(){ int i; double v[3]={3,4,5},x[3]={1,2,3}; double *pv,*px; double sum,dist; pv=v; px=x; sum=0.0; for(i=0; i<N; i++){ sum+=(*(pv+i)-*(px+i))*(*(pv+i)-*(px+i)); } dist=sqrt(sum); printf(“距離は%lf\n”,dist);
お疲れ様でした!!