linux c 理解指针

指针在c语言中是一个重要的角色,它提供一种远程访问数据结构的方式,为c语言中所有的结构段,数据段都定义一个门牌号码,方便在程序中调用.
例:

   struct str{int i;char v};
   union uni {int i;char v};
   int a =15;
   void digui(int * xp){
    void (*f)(int *) = digui;
    struct str s={1,'a'};
    union uni *up =(union uni *)malloc(sizeof(union uni));
    int *ip[2] ={xp,&g};
    up->v = s.v+1;
    
    printf("ip = %p,*ip=%p, **p=%d\n",ip,*ip,**ip);
    printf("ip+1=%p,ip[1]=%p,*ip[1]=%d\n",ip+1,ip[1],*ip[1]);
    printf("&s.v=%p,s.v='%c'\n",&s.v,s.v);
    printf("&up->v=%p,up->='%c'\n",&up->v,up->v);
    printf("f=%p\n",f);
    if(--(*xp) >0) f(xp);
   }

   void main(){
     int x=2;
     digui(&x);
   }

综上代码可以归纳出
指针类型和指针所指向的对象类型是一致的
每个指针都有一个值,这个值是某个指定类型的对象的地址。特殊的指针null(0)表示该指针没有指向任何地方,及空指针。

指针是用 &创建的 例如 &g &s.v &up->v
指针是采用* 间接引用 *p

指针和数组是紧密联系的,可以引用一个数组的名字就像使用指针变量一样使用它,但是不可以修改 例如 a[3] *(a+3)
指针可以指向一个函数,这种情况就提供一个强大的代码传递功能,例 void (*f)(int *) = digui
*f 必须加上括号,否则会变成 (void * ) f(int *)=digui
以上为阅读 “深入理解计算机系统所记载”。