简述 C 指针

c指针的本质:指针就是地址,这是理解指针的第一步。指针之所以难以理解在于c的羞涩语义。

看一个一级指针例子:

#include <stdio.h>
int main()

{
        int foo;
        int *foo_p;
        foo=5;
        foo_p=&foo;

        printf("foo....%d\n",foo);
        printf("*foo_p....%d\n",*foo_p);
        printf("&foo....%p\n",&foo);
        printf("foo_p....%p\n",foo_p);
        printf("&foo_p....%p\n",&foo_p);
        return 0;

}

运行结果:

foo....5 // foo = 5
*foo_p....5 // *foo_p = 5 *xxx表示指针的内容
&foo....0x7ffd851df8f4  //foo的取地址操作
foo_p....0x7ffd851df8f4 //foo_p的值是foo的地址
&foo_p....0x7ffd851df8f8 //foo_p的地址

二级指针例子:

1 #include <stdio.h>
  2 int main()
  3 
  4 {
  5         int foo;
  6         int *foo_p;
  7         int **foo_pp;
  8 
  9         foo = 5;
 10         foo_p = &foo;
 11         foo_pp = &foo_p;
 12 
 13         printf("foo....%d\n",foo);
 14         printf("&foo....%p\n",&foo);
 15 
 16         printf("foo_p....%p\n",foo_p);
 17         printf("&foo_p....%p\n",&foo_p);
 18         printf("*foo_p....%d\n",*foo_p);
 19 
 20         printf("foo_pp....%p\n",foo_pp);
 21         printf("&foo_pp....%p\n",&foo_pp);
 22         printf("*foo_pp....%p\n",*foo_pp);
 23         printf("**foo_pp....%d\n",**foo_pp);
 24         return 0;
 25 
 26 }

运行结果:

foo....5 //
&foo....0x7ffec682940c //取地址操作
foo_p....0x7ffec682940c //foo_p 存 的值是foo的地址
&foo_p....0x7ffec6829410 //取地址操作
*foo_p....5 // 引用操作符 * ,*foo_p 获取该地址(foo地址)的内容
foo_pp....0x7ffec6829410 //foo_pp 存的值是foo_p的地址
&foo_pp....0x7ffec6829418 //取地址操作
*foo_pp....0x7ffec682940c //引用操作符,*foo_pp 的值为foo_p的地址
**foo_pp....5 // 引用操作符*,引用两次,*foo_pp 的值为foo_p的地址,*(*foo_pp)地址的值为5

各变量名的类型推导,foo_p是指针,且指向int,故foo_p的类型是int*,也就是在‘*’前添加int;foo_pp也是指针,且指向foo_p,故foo_pp的类型是int**.也是在‘*’前添加int*.

更高阶的指针类型,以此类推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值