0
0

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 3 years have passed since last update.

C言語で文字列リテラルをポインタに代入したときと配列に代入した時の違い

Posted at

C言語で文字列リテラルをポインタに代入したときと配列に代入した時の違い

目的

次の2つの共通点と違いを理解する

char *s_pointer = "hoge";
char s_array[] = "hoge";

文字列リテラルと配列の初期化

文字列リテラルは配列の初期化と同義である。

char s_array[] = "hoge";

は次と同値

char s_array[5] = {'h', 'o', 'g', 'e', '\0'}; // \0は終端を表す

つまりs_arrayは配列

ポインタに配列を代入する

ポインターへの配列の代入は先頭要素のポインタ代入を意味する。

char[] array;
char *p;
p = array; // p = &array[0]と同義

ポインタ=配列ポインタ=&配列[0]は全く一緒という意味になる。
つまりs_pointerはあくまでポインタである。

共通点

ポインタ[i]はi個先のポインタを返し、配列[i]はi+1番目の要素のポインタを返す。
すなわちポインタが配列の先頭要素を指しているとき、ポインタ[i]配列[i]は全く同じ結果となる。

違い

ポインタはポインタ、配列は配列なのでsizeofの結果は異なる。

char *s_pointer = "hoge";
char s_array[] = "hoge";

printf("sizeof: %d\n", sizeof(s_pointer)); // 8
printf("sizeof: %d\n", sizeof(s_array)); // 5 charのサイズ(1)×要素数(5)

またs_pointerはポインタであり、インクリメントによって指す対象を変更できる

printf("%c\n", *s_pointer); // h
s_pointer++;
printf("%c\n", *s_pointer); // o
s_pointer += 2;
printf("%c\n", *s_pointer); // e

s_arrayは配列であり、このような扱いは不可能

s_array++ // コンパイルエラー
0
0
0

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?