修正
理解不足の点があり誤解を招く表現があったので訂正しました。
Cの理解が足りなかったです。
今後正しい理解を深めようと思います。
言い訳になってしまいますが、配列表現のちょっと変わった使い方があるので共有しようと思ったのがきっかけです。
はじめに
C言語の入門書では、ポインタの話をしていたら配列的な表現で書かれるとこがあります。
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int main(void)
{
int *test;
int i;
test = (int *)calloc(MAX, sizeof(int));
for (i = 0; i < MAX; i++) {
test[i] = i; // ここの test[i] は配列(みたい)
}
}
そもそもCにおける配列とは
かなり語弊のある言い方をすると、(他の言語における配列型という意味では)Cには配列はありません。
これは、私の理解不足でした。
int test[4];
上記は test
という配列を宣言したものですが、 test
の要素にアクセスする場合ポインタのようにアクセスできます。
test[i]
という表記は?
test[i]
は *(test + i)
という書き方もできます。
すなわち、 test
の先頭の要素を指すアドレスに i
を足したアドレスにアクセスするということです。
勘のいい方は気づいたと思いますが、足し算は交換法則が成り立ちます。
なので、 *(i + test)
でも問題ありません。
ということは i[test]
も問題なくアクセスできます。(コンパイルエラーにもなりません)
もちろん 1[test]
なども問題なくコンパイルできます。(あえてすることはありませんが・・・)
最後に
C言語において配列とポインタのことについて、ちょっと変わった表現があるので紹介しました。