0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語でポインタに配列っぽくアクセスできる理由

Last updated at Posted at 2018-11-13

修正

理解不足の点があり誤解を招く表現があったので訂正しました。
Cの理解が足りなかったです。
今後正しい理解を深めようと思います。
言い訳になってしまいますが、配列表現のちょっと変わった使い方があるので共有しようと思ったのがきっかけです。

はじめに

C言語の入門書では、ポインタの話をしていたら配列的な表現で書かれるとこがあります。

test.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言語において配列とポインタのことについて、ちょっと変わった表現があるので紹介しました。

0
1
12

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?