本日の目標
- 一次元配列とポインタの関係を知る。
- ポインタを使って配列を操作できる。
- 配列を関数間でポインタを使って受け渡しができる。
予習・復習
以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。本日の講義・演習予定
- 配列とアドレス
- 関数に配列を引き渡す
- リトルエンディアンとビッグエンディアン
- 演習問題
- 提出課題
int a[3] = {1,2,3}; int *p; p = a; // p=&a[0];と同じ printf("a[0]の先頭アドレス %p\n", p); printf("a[1]の先頭アドレス %p\n", p+1); printf("a[2]の先頭アドレス %p\n", p+2);
#include <stdio.h> int main(void) { int a[5] = {90,78,66,85,95}; int i; for(i=0; i<5; i++) printf("a[%d] = %d (%p)\n", i,a[i],&a[i]); return 0; }
#include <stdio.h> int main(void) { char c[6] = "Hello"; //もしくはc[6]={'H','e','l','l','o','\0'} int i; for(i=0; i<6; i++) printf("c[%d] = %c (%p)\n", i,c[i],&c[i]); return 0; }
#include <stdio.h> int main(void) { int a[5] = {90,78,66,85,95}; int i; printf("配列名a -> (%p)\n",a); //配列の開始アドレス for(i=0; i<5; i++) printf("*(a+%d) = %d (%p)\n", i,*(a+i),a+i); // 間接参照 アドレス演算 return 0; }
#include <stdio.h> int main(void) { char c[] = "Hello"; //{'H','e','l','l','o','\0'}でもOK int i; printf("配列名c -> (%p)\n",c); //配列の開始アドレス for(i=0; i<6; i++) printf("c[%d] = %c (%p)\n", i,*(c+i), c+i); return 0; }
#include <stdio.h> int main(void) { int a[5] = {90,78,66,85,95}; int *p; int i; p = a; // p = &a[0];でもOK printf("a -> (%p) p -> (%p)\n",a,p); //配列の開始アドレス for(i=0; i<5; i++) printf("*(p+%d) = %d (%p)\n", i,*(p+i),p+i); return 0; }
#include <stdio.h> int main(void) { int a[5] = {90,78,66,85,95}; int *p; int i; p = a; // p = &a[0];でもOK printf("p -> (%p)\n",p); //配列の開始アドレス printf("++*p = %d \n", ++*p); printf("*p++ = %d \n", *p++); printf("*++p = %d \n", *++p); printf("p -> (%p)\n",p); return 0; }
void func(int a[]) { ・・・ a[i] //i番目の要素の参照 ・・・ }2)
void func(int a[10]) { ・・・ a[i] //i番目の要素の参照 ・・・ }3)
void func(int *a) { ・・・ *(a+i) //i番目の要素の参照a[i]でも可 ・・・ }
#include <stdio.h> int sumof_a(int a[], int size); int sumof_b(int *a, int size); int main(void) { int score[5]={82,98,77,85,68}; int i; printf("合計i: %d\n", sumof_a(score,5)); printf("合計i: %d\n", sumof_a(score,5)); return 0; } int sumof_a(int a[], int size) { int i, sum=0; for(i=0; i<size; i++) sum += a[i]; return sum; } int sumof_b(int *a, int size) { int i, sum=0; for(i=0; i<size; i++) sum += *(a+i); return sum; }
#include <stdio.h> /* 配列のn番目の要素を値valueにする */ void setValue(int *a, int n, int value) { *(a+n) = value; } /* 配列の表示 */ void printArray(int *a , int n) { int i; for(i=0; i<n; i++) printf("%3d", a[i]); printf("\n"); } int main(void) { int a[5] = {0}; setValue(a, 2, 7); //2番目の要素を7に printArray(a,5); return 0; }
#include <stdio.h> int main(void) { int a = 0x12345678; //4バイト char *p; //1バイト p = (char *)&a; //キャスト printf("%x (%p)\n", *p,p); printf("%x (%p)\n", *(p+1),p+1); printf("%x (%p)\n", *(p+2),p+2); printf("%x (%p)\n", *(p+3),p+3); return 0; }
今週の確認テスト テスト(PDF)
#include <stdio.h> #define N 7 /* 配列aの要素の合計を求める */ int sum(int *a, int n) { // ここを埋めて完成させる } /* 配列の要素を表示する */ void printArray(int *a, int n) { // ここを埋めて完成させる } /* 昇順に並べ替える*/ void sort(int *a, int n) { int i,j,tmp; for(i=1; i<n; i++){ for(j=0; j<n-i; j++){ if([空欄ア]){ // 隣の要素同士を比較し前の方が大きければ [空欄イ] // 複数行空欄、要素を交換するコードをここに記述 } } } } int main(void) { int i; int score[N]; for(i=0; i<N; i++) scanf("%d", &score[i]); printArray(score, N); printf("合計: %d\n",sum(score, N)); sort(score,N); printArray(score,N); return 0; }