//file1.c
#include <stdio.h>

char ch[10];
//file2.c
#include <stdio.h>

extern char *ch;

int main()
{
  ch[0]=1; 
  return 0;
}
---------------------------------------
gcc file1.c file2.c -o ap
./ap
段錯(cuò)誤
-----------------------------------------------
1,array vs pointer
file2,c ch[i]實(shí)際上得到的是一個(gè)字符,但編譯器把它當(dāng)成是一個(gè)指針,因?yàn)榇宋募新暶鳛橹羔?br>先取地址ch的內(nèi)容,加上i,當(dāng)作字符ch[i]的地址。實(shí)際上所謂的地址是ch[0]+i;
char ch[10]; 符號(hào)ch具有一個(gè)地址,ch[i],只需將i+ch具有的地址相加,再取其指向的內(nèi)容
extern char *ch; ch[i],得到地址p的內(nèi)容,把它加上i,再取所得地址指向的內(nèi)容。
而事實(shí)上p指向的內(nèi)容是ch[0]//one char.而非地址。

2.定義vs聲明
定義只有一次,且分配內(nèi)存,一種特殊的聲明。
聲明可多次,不分配內(nèi)存。

3.編譯器不為指針指向的對(duì)象分配空間,只是分配指針本身的空間。
除非在定義時(shí)賦一string初始化,且只可以是字符串常量。只讀不可修改。
 char *p="Hello world";
  p[0]='h'; //段錯(cuò)誤。