字符指针与字符串:
char buf[100] = "hello";
char *s = "hello"; //把字符串的首地址存入s中*
*s = 'e'; //error, 因为"hello"存放在字符串常量区, 所以不能修改
s = buf; //right, 因为s是变量,所以s可以修改
*s = 'e'; //right, 因为s指向buf,现在改变的是buf中额内容
指针数组: 数组, 数组元素是指针的数组
int* a[5]; //拥有5个int *类型(32位地址)的数组
char* a[10]; //拥有10个char *类型(32位地址)的数组
int a[3][4];
int* b[3] = {a[0], a[1], a[2]}; //a[0](int*类型) 为a[0][0]的地址
char* s[5] = {"Apple", "Orange", "Pear", "Peach", "Banana"}; //把字符串的首地址存入s数组中
数组指针: 指针, 指向数组的指针
int (*a)[4]; //a是一个指向拥有4个int元素数组的指针 --- a是一个指向一维数组的指针
char (*a)[100]; //指向拥有100个char元素数组的指针
int (*a)[4];//定义一个指针数组
int b[4] = {1,2,3,4}; //b是一个拥有4个int元素的数组
a = &b; //a是一个指向b的指针
int a[3][4];//定义二维数组
int (*p)[4] = a; //&a[0]
野指针: 没有初始化的指针
int *p = NULL;
*p = 100; //error, 段错误, 非法访问内存
int a;
p = &a; //right
*p = 100;
对于野指针, 需要赋给一片合法的空间才能使用
段错误出现的原因:非法访问内存
指针定义时 要避免野指针
void *:可以接收任意类型的地址, 需要强转成具体的类型才能使用
int a;
void *p = &a;
printf("%d\n", *(int*)p);