List10-11 のプログラムをもとに,以下の変更を加えなさい。ただし,アドレス演算子 & は使用しないでください。
  1. 配列aの0〜4番目(添字が0〜4)のそれぞれの要素のアドレスを表示するコードを,main関数の中に追加する。
  2. さらに,配列vの0〜n-1番目(添字が0〜n-1)のそれぞれの要素のアドレスを表示するコードを,ary_set関数の中に追加する。
  3. アドレスの値を画面表示するには,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"
	と表示される。
	******************/
}