読者です 読者をやめる 読者になる 読者になる

破棄されたブログ

このブログは破棄されました。

C 言語メモ

配列とポインタについて

  • 配列変数はアドレスを示す。(ポインタっぽい性質)
  • 配列のインデックス 0 のアドレスは、配列変数の示すアドレスと等しい
  • 配列変数を別変数から参照するには、ポインタを使う。
  • 宣言時のサイズを超えてインデックスを指定できてしまう。
  • 配列の値渡しはどうしたらいいの。
  • 配列を指しているポインタを sizeof 関数に渡しても、配列の長さを返してはくれない。
#include <stdio.h>

int main()
{
    int contestants[] = {1, 2, 3};
    int *choice;


    /* 配列のインデックス 0 は、* 演算子でも参照できる */
    printf("address of contestants: %p\n", contestants);
    printf("value of *contestants: %i\n", *contestants);
    printf("value of contestants[0]: %i\n", contestants[0]);

    /* 配列はアドレスを示しているから & は不要 */
    choice = contestants;
    printf("address of choice: %p\n", choice);
    printf("value of choice: %i\n", *choice);

    /* 配列変数そのものと、インデックス 0 のアドレスは同じ */
    choice = &contestants[0];
    printf("address of choice: %p\n", choice);
    printf("value of choice: %i\n", *choice);

    /*
     * ポインタ choice には、配列 contestants のアドレスが渡っているため
     * インデックス 0 以外も参照できる
     */
    printf("value of choice[1]: %i\n", choice[1]);

    /* 配列のインデックスは、宣言時のサイズよりも大きいものを指定できてしまう */
    printf("value of contestants[3] (out of index): %i\n", contestants[3]);

    /* これはダメ */
    /* int *array_pointer[]; */

    /* これもできないみたい */
    /*
    int array_pointer[];
    array_pointer = &contestants;
    */

    /* これももダメっぽい */
    /* int array_pointer[] = contestants; */

    /* 配列変数を渡すと配列のサイズを返す */
    printf("sizeof contestants:%i\n", sizeof(contestants));
    /* 配列のアドレスを渡したポインタを渡すとアドレスの長さを返す */
    printf("sizeof choice:%i\n", sizeof(choice));
    /* * 演算子を使ってもダメ */
    printf("sizeof choice:%i\n", sizeof(*choice));


    return 0;
}
広告を非表示にする