指针原理详解

1,理解变量的储存过程

1.1,直接“=”赋值

int a = 5;
printf("a = %d",a);
//a = 5

计算机内部操作:

  • int a ;在栈中定义了一个变量a,在内存中开辟了一个int类型的空间,分配了4个字节,然后让a指向这片空间,也就是计算机把这片空间分配给了a,a有了属于自己的空间。

  • a = 5 ;在a的那片空间里,里面存放数值5,把5转换成二进制,存到a的4个字节的空间

1.2,用scanf函数手动赋值

scanf("%d",&a);

用户输入了int类型的数值,比如说输入5,然后&a,找到a的那片空间,把5转换成二进制,存入a的那片地址空间,完成了对a的赋值,也就是在a的那片字节中填入了二进制的5

1.3,总结

一个变量的储存,先从内存中开辟一个类型大小的空间,让变量指向这片空间,也就是这片空间属于这个变量,再在这片空间存储你要存储的数值

2,int*的存储过程和和原理

int a = 999;
int* p ;
p = &a;
printf("%d\n",p);
printf("%d\n",*p);//变量名称前必须要加上*

计算机在这个过程中,做了以下事情

  • 把存放一个int 类型变量的地址赋给一个 int* 指针类型的变量

  • ’=‘左边是一个int*类型的指针变量,可以存放放置着int 类型数值的地址

  • ’=‘右边是&a,a是int类型的变量数值5,&是取地址符,&a就是拿到int类型a的数值的地址

总的来说,就是把a的那片空间,给了p一个钥匙,让p也可以对a那片空间操作

指针类型,int* p 中变量名叫p 类型为int*,也就是整型的指针类型,可以存放一个int类型数据的地址。所以不能把一个具体的数字赋值给指针,类型不匹配,一个是指针类型,一个是int类型

 int a = 5;
 int *p;
 p = &a;

这里a是一个int类型的变量,存放int类型的数值5

&a取到了存放int类型a的地址

p=&a,把int类型的a地址赋给了int*类型的p

也就是int*类型的变量可以存放一个int数据的地址

3,int**的存储过程和原理

int a = 5;
int *p;
p = &a;
int **q;
q = &p;
printf("q = %d\n",q);

int** q:变量名称是q,数据类型是int**

int* 中存放的是int类型的数据地址

int** 中存放的是int类型数据地址的地址

也就是说,一个*是指的一个int数值a的地址,那么两个**存放的是p的地址

p存放a的地址,p本身就是一个变量,它的值为a的地址,所以内存也给p开辟了一个空间,让它存放p的地址,而q作为一个变量存放的就是p的地址,关系如下

a<-----p<-----q

4,int 的存储过程和原理

int*** m;
m = &q;
printf("m=\n",m)

m就是存放q的地址,也就是说

int存放的是int**类型的地址

5,指针操作(*操作)

int a = 5;
int* p ;
int** q ;
int*** m ;
p = &a;
q = &p;
m = &q;
printf("p = %d\n",p);
printf("*p = %d\n",*p);
printf("q = %d\n",q);
printf("*q = %d\n",*q);
printf("**q = %d\n",**q);
printf("m = %d\n",m);
printf("*m = %d\n",*m);
printf("**m = %d\n",**m);
printf("***m = %d\n",***m);
/*结果如下
p = 6618636
*p = 5
q = 6618624
*q = 6618636
**q = 5
m = 6618616 m的地址
*m = 6618624 q的地址
**m = 6618636 p的地址
***m = 5 a的值
*/

p,q和m都是上述例子中的变量,分别对应着各自的地址的值,而*符号则是对该地址进行取值操作,因为每个地址都有各自的值

举个现实中的例子,你比如说去银行开保险柜,其中p操作比如开保险柜这个操作,你得先拿着你的柜子号在银行找到保险柜,然后拿着钥匙再打开保险柜取出里面的钱;就像是p中存放的是一个地址,你先拿着p中存放的地址,在内存中找到那块空间,然后再p操作,取出那块空间中存放的值。

所以 * 操作就是取值操作,即取出指针变量存放的地址中所存放的数据。

如何分析*操作呢?

  • *p:先看成*(p),再从里向外看,首先他有一个变量p,所有直接可以先从内存中拿到p存放的数据6618636(p中的数据),再找到内存中6618636那片内存,最后取出6618636中的存放数据5(具体数据)

  • **q:先看成*(q),再从里向外看,首先他有一个变量q,所有直接可以先从内存中拿到q存放的数据6618636(p中的数据),再找到内存中6618636那片内存,最后取出6618636中的存放数据5(具体数据)

  • ***m同理

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值