int *p;    int a = 99;    p = &a;    *p = 10;    printf("%p %p %d\n",p,&a,a); 
 
0x7fff5fbff744 0x7fff5fbff744 10 *p定义了一个指针变量,只能存放地址,所以通过&寻址符,将a的地址赋值给指针p然后使用*访问地址符,访问p地址并更改值为10 最终打印的结果也很明显,两个地址完全一样,而且a通过指针间接被修改为10  
  int **pp = &p;    **pp = 5;    printf("%d\n",a); 
 
5 上面的代码表示了指向指针的指针,所以出现了多个*符号  
  int arr[5] = {10,9,8,7,6};    int *ap;    ap = arr;    printf("ap : %d\n",*(ap + 2));//加1的长度取决于类型    printf("arr : %d\n",*(arr + 2)); 
ap : 8 arr : 8 关于数组和指针呢,数组名代表其首元素的地址,所以不需要&符号而且由于数组本身就是地址,所以指针指向后和数组本身的方法是通用的 指针+1其实表示的是地址变更,而变更幅度和类型相关  
 //常量区,堆:对象,栈:局部变量    char name[] = "abc";//这种写法是字符串变量    char *name2 = "abc";//这种是字符串常量    char *name3 = "abc";    printf("name:%p\nname2:%p\nname3:%p\n",name,name2,name3); 
name:0x7fff5fbff72c name2:0x100000f4b name3:0x100000f4b name[]和*name有根本的区别,存放的区域不同,而且*name无法更改注意:由于name2进入常量区,所以name3再次指向“abc”时,实际上是接入了同样的地址  
  
    char *name4[5] = {"abc","bbc"};    printf("%s\n",name4[0]);    //name4[0][0] = 'A';    printf("%s\n",name4[1]); 
abc bbc  
字符串指针数组的写法 
 
    void (*o)();    o = text;    (*o)();    o(); 
void text(){    printf("text!\n");} 
text! text! 这里的代码展示了指向函数的指针,以及如何通过指针调用函数,因为函数名和数组一样就是地址,所以也不需要&符号 
int *back(){    int *p;    return p;}最后展示了一个返回指针的函数 
 |