//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'; //段错误。