//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
段錯誤
-----------------------------------------------
1,array vs pointer
file2,c ch[i]實際上得到的是一個字符,但編譯器把它當成是一個指針,因為此文件中聲明為指針
先取地址ch的內容,加上i,當作字符ch[i]的地址。實際上所謂的地址是ch[0]+i;
char ch[10]; 符號ch具有一個地址,ch[i],只需將i+ch具有的地址相加,再取其指向的內容
extern char *ch; ch[i],得到地址p的內容,把它加上i,再取所得地址指向的內容。
而事實上p指向的內容是ch[0]//one char.而非地址。

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

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