今週は,C言語を学習する上でもっとも挫折することの多い,でも,C言語のもっともC言語らしいところである,ポインタについて取り上げます.
まずは,その前に前期の復習と行きましょう.
例:入力された文字列“test”→結果“estt”
#include <stdio.h> void main() { char s[256], t; int n, i, j; //文字列の入力 printf("単語を入力してください\n"); scanf("%s", s); printf("入力された文字列は%sです.\n", s); // 文字数を数える for(i=0; s[i] != 0x00; i++); printf("文字数は,%d文字です.\n", i); n = i; // 並び替え for(i=0; i < n-1; i++){ for(j=i+1; j < n; j++){ if(s[i] > s[j]){ t = s[i]; s[i] = s[j]; s[j] = t; } } } printf("結果 : %s\n", s); }
データのメモリアドレスを指し示す(ポイントする)ための変数
ポインタ変数の値 = メモリアドレス
参考 : 普通の変数の値 = 数値や文字
#include <stdio.h> void main() { char a; short b; printf("aのアドレスは,%x,bのアドレスは%x \n", &a, &b); }
例:
#include <stdio.h> void main() { int a,b; char *p; a = 3; p = &a; b = *p; printf("%d", b); }
まずは,例から:
#include <stdio.h> void main() { char src[20] = "Thank you."; int i; char *p; p = &src[0]; printf("文字列="); for(i=0; src[i] != '\0'; i++){ printf("%c", *(p+i)); } }
ここで, p = &src[0]; とすると,pには配列の先頭のアドレスが入ります.
では,P+1には何が入るでしょう?
ここで,キーボードから文字を入力する命令 scanf を思い出してみよう.
int a; scanf("%d", &a);
この,&aは実はポインタを意味していて,aのアドレスに値を入力していたのです.
1.変数a,bに数字をキーボードから入力し,a+bを求めて表示するプログラムをポインタ変数を使って書き換えよ.
元になるプログラム:
#include <stdio.h> void main() { int a,b; scanf("%d", &a); scanf("%d", &b); printf("答え:%d\n", a+b); }
書き換えるプログラム:
#include <stdio.h> void main() { int a,b; int *pa,*pb; pa = &a; pb = &b; scanf("%d",?????); scanf("%d",?????); printf("答え:%d\n",?????????); }