まあ、ポインタと配列は一緒とか云っている人は、一遍
シンデミル?int array[なんかでかいすうじ]; なグローバルな実体を extern int *array; で参照してはまればいいと思うよw
手っ取り早く確かめるのはこんなんで。
たぶんSEGVで落ちるはず。
なぜ SEGVで落ちるのかわからなかったので、試してみた。
/* cmd /V:ON SetEnv cl a.c foo.c bar.c */ #include <stdio.h> void foo(); // foo.c void bar(); // bar.c char array[256]; int main() { printf("main: :array: %p\n", array); printf("main:addr:array: %p\n", &array); foo(); printf("%s\n", array); bar(); printf("%s\n", array); return 0; }
配列(array)を配列(char[])として参照。
extern char array[]; // a.c void foo() { printf("foo : :array: %p\n", array); printf("foo :addr:array: %p\n", &array); strcpy(array, "hello, foo world"); }
配列(array)をポインタ(char*)として参照。
extern char *array; // a.c void bar() { printf("bar : :array: %p\n", array); printf("bar :addr:array: %p\n", &array); strcpy(array, "hello, bar world"); }
main: :array: 0040DAA0 < char array[] main:addr:array: 0040DAA0 > &array == array foo : :array: 0040DAA0 > foo:array == array foo :addr:array: 0040DAA0 > &foo:array == foo:array hello, foo world bar : :array: 6C6C6568 < 6C(l) 6C(l) 65(e) 68(h) bar :addr:array: 0040DAA0 > &bar:array が arrayと同じ (a.exe は動作を停止しました)
確かに落ちた。
例えば arrayと書いたときに得られるイメージが 6C6C6568... だったとする。これを charと解釈すれば 'h'(68h) になるし、intと解釈すれば 1819043176(6C6C6568h) になる。shortなら 25960(6568h)。では char* なら? そのまま 6C6C6568。(ポインタのサイズが 64-bitなら、あと 4バイト先まで読むことになるが)。ではでは char[]なら? 6C6C6568... というメモリ領域を指すアドレスが手に入る。
arrayとラベルされたメモリ領域(6C6C6568...)が存在するときに、それをポインタとして扱った場合と、配列として扱った場合では、得られるものがまるで違う。(6C6C6568というメモリ上の値か、そのアドレスか)
配列とポインタが混同されるのはどちらもアドレスが得られるから。違うのはそのときその変数が参照しているメモリイメージ。配列変数は配列の中身が格納された領域を参照しながらそのアドレスを返すが、ポインタ変数はアドレスが格納された領域を参照しており、その内容をそのまま返している。
* 違うみたい。>http://www.kt.rim.or.jp/%7ekbk/zakkicho/08/zakkicho0808a.html#D20080809-2