List10-11 のプログラムをもとに,以下の変更を加えなさい。ただし,アドレス演算子 & は使用しないでください。
- 配列aの0〜4番目(添字が0〜4)のそれぞれの要素のアドレスを表示するコードを,main関数の中に追加する。
- さらに,配列vの0〜n-1番目(添字が0〜n-1)のそれぞれの要素のアドレスを表示するコードを,ary_set関数の中に追加する。
- アドレスの値を画面表示するには,List10-10を参考にすれば,以下のように書けるでしょう。
printf("アドレスの値:%p\n", ポインタ型の変数);
教員からの解答例
/*
配列の受渡し
*/
#include <stdio.h>
void ary_set(int v[], int n, int val)
{
int i;
for(i = 0; i < n; i++)
v[i] = val;
/* 配列vを,ポインタとして扱って,アドレスを表示する */
for(i = 0; i < n; i++)
printf("v[%d]のアドレス:%p\n", i, v+i);
/* 追加コードここまで */
}
int main(void)
{
int i;
int a[] = {1, 2, 3, 4, 5};
ary_set(a, 5, 99);
for(i = 0; i < 5; i++)
printf("a[%d] = %d\n", i, a[i]);
/* 配列aを,ポインタとして扱って,アドレスを表示する */
for(i = 0; i < 5; i++)
printf("a[%d]のアドレス:%p\n", i, a+i);
/* 追加コードここまで */
return (0);
}
間違いの例
アドレス演算子 & を使用している例(問題文をよく読むように! 注意!)
#include <stdio.h>
void ary_set(int v[], int n, int val)
{
int i;
for (i = 0; i < n; i++)
v[i] = val;
for (i = 0; i < n; i++)
printf("v[%d]のアドレス:%p\n", i, &v[i]); /* &演算子で,v[i]のアドレスを取り出している */
}
int main(void)
{
int i;
int a[] = {1, 2, 3, 4, 5};
ary_set(a, 5, 99);
for (i = 0; i < 5; i++)
printf("a[%d] = %d\n", i, a[i]);
for (i = 0; i < 5; i++)
printf("a[%d]のアドレス:%p\n", i, &a[i]); /* &演算子で,a[i]のアドレスを取り出している */
return (0);
}
テキスト289ページの演習11-1
教員からの解答例
#include <stdio.h>
int main(void)
{
char *p = "123" ;
printf("p = \"%s\"\n", p) ;
/* p = "456" ; */
p = "456" + 1 ;
printf("p = \"%s\"\n", p) ;
return 0 ;
/******************
p = "456" ;
を実行すると,
文字リテラル"456"
(すんなわち,文字型の配列)
の先頭文字'4'
(すなわち,文字型の配列の,0番目の要素)
のアドレスが,pに代入される。
p = "456" + 1 ;
を実行すると,
文字リテラル"456"
の先頭文字'4'
のアドレスに,文字型の配列1要素分のアドレスが,足され,
その値が,pに代入される。
すなわち,pには,
文字リテラル"456"
の2文字目の'5'
のアドレスが,代入される。
printf()関数に,その,ポインタ型の変数pを引数で渡すと,
変換指定子を %s とした場合には,
printf()関数は,
そのpを文字型の配列とみなし,
ナル文字にぶつかるまで,その要素たる文字を,pが指す要素から,1文字ずつ順番に,画面出力する。
したがって,
画面上には,
"56"
と表示される。
******************/
}