本日の目標
- 一次元配列とポインタの関係を知る。
- ポインタを使って配列を操作できる。
- 配列を関数間でポインタを使って受け渡しができる。
予習・復習
以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。本日の講義・演習予定
- 配列とアドレス
- 関数に配列を引き渡す
- リトルエンディアンとビッグエンディアン
- 演習問題
- 提出課題
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;
}