配列とポインタ
http://d.hatena.ne.jp/heiwaboke/20091012/1255275804の話。
別の場所で教えた内容をちょっと引っ張ってみる。
前提として。
- 配列とポインタは違う。
- アドレスだけではなく、型も考慮するべき。
- 譬え話ではなく、仕様書を読もう。
具体的には。
#include <stdio.h> #define DUMP(FMT,VAL) printf("%-16s = "FMT "\n", #VAL, (VAL)) int main() { char const arr[2] = "a"; char const* ptr = "a"; DUMP("%p", arr); DUMP("%p", &arr); DUMP("%p", &arr[0]); DUMP("%p", arr+1); DUMP("%p", &arr+1); DUMP("%p", &arr[0]+1); DUMP("%d", sizeof(arr)); DUMP("%d", sizeof(&arr)); DUMP("%d", sizeof(&arr[0])); DUMP("%p", ptr); DUMP("%p", &ptr); DUMP("%p", &ptr[0]); DUMP("%p", ptr+1); DUMP("%p", &ptr+1); DUMP("%p", &ptr[0]+1); DUMP("%d", sizeof(ptr)); DUMP("%d", sizeof(&ptr)); DUMP("%d", sizeof(&ptr[0])); return 0; }
↑の結果が↓となる。
arr = 0xbfeee752 &arr = 0xbfeee752 &arr[0] = 0xbfeee752 arr+1 = 0xbfeee753 &arr+1 = 0xbfeee754 &arr[0]+1 = 0xbfeee753 sizeof(arr) = 2 sizeof(&arr) = 4 sizeof(&arr[0]) = 4 ptr = 0x80486c0 &ptr = 0xbfeee74c &ptr[0] = 0x80486c0 ptr+1 = 0x80486c1 &ptr+1 = 0xbfeee750 &ptr[0]+1 = 0x80486c1 sizeof(ptr) = 4 sizeof(&ptr) = 4 sizeof(&ptr[0]) = 4
〆。
では仕様書の該当個所を読んでくれ。