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同理