变量的存储过程和原理
int main (void){
int a ;
a = 5;
printf("a = %d",a);
}
结果: a = 5
(1)int a;
- 在栈中定义了一个变量a
- 在内存中开辟了一个int类型大小的空间
- 让a指向这片空间
(2) a = 5;
- 把5转换成二进制
- 存到a的4个字节的空间
指针类型(int *)的存储过程和原理
int main (void){
int a;
int *p;
p = &a;
printf("p = %d\n",*p);
}
结果: p = 6487572
注意:
int * p,虽然是*p在一起写着,但是变量名叫p,类型为int *,也就是整型的指针类型
(1)int a;
- 给a在内存中开辟4字节大小的空间
(2)int *p;
- 给p在内存中开辟4字节大小的空间
(3)p = &a;
- &a先获得a的地址6487572
- 然后把6487572转化为二进制
- 存到p的4个字节的空间
注意:
int *p; 变量名叫p,类型为int *,可存放一个int数据的地址 。
指针类型(int **)的存储过程和原理
int main (void){
int a;
int *p;
int **q;
p = &a;
q = &p;
printf("p = %d\n",p);
printf("q = %d\n",q);
}
结果:
p = 6487572
q = 6487560
int ** q; 变量名为q,数据类型为int **
int *中存放的是int类型数据的地址
int **中存放的是int类型数据的地址的地址
他们的指向关系如下 :
a<—-p<—-q
指针类型(int ***)的存储过程和原理
int main (void){
int a;
int *p;
int **q;
int ***m;
p = &a;
q = &p;
m = &q;
printf("q = %d\n",q);
printf("p = %d\n",p);
printf("m = %d\n",m);
}
结果:
q = 6487560
p = 6487572
m = 6487552
既然,int 和int * 都懂了,那么int ***就迎刃而解了
同理,int ** * 存放的是 int **类型数据的地址
指针操作(*操作)
int main (void){
int a;
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 = 6487572
*p = 0
q = 6487560
*q = 6487572
**q = 0
m = 6487552
*m = 6487560
**m = 6487572
***m = 0
简而言之,* 操作就是取值操作,即取出指针变量存放的地址中所存放的数据
(1)*p ;
- 先看成*(p),再从里向外看
- 首先他有一个变量p,所以直接可以先从内存中拿到p存放的数据6487572(a的地址),
- 再找到内存中6487572那片内存
- 最后取出6487572中的存放数据
(2)**q ;
- 先看成 *( * (q)),再从里向外看
- 从内存中拿到q存放的数据6487572
- 再从内存中找到6487572那片内存
- 取出存放的数据6487572,这时已经完成了 * (q)操作
- 之后从内存中找到6487572那片内存,
- 取出存放的数据
(3)***m = 5
- 先看成 *( * ( * (m) ) ),再从里向外看
- 先从内存中拿到m存放的数据6487552
- 再从内存中找到6487552那片内存
- 取出存放的数据6487560,这时已经完成了* (m)操作
- 再从内存中找到6487560那片内存
- 取出存放的数据6487572,完成了 * ( * (m ) )操作
- 再从内存中找到6487572那片内存
- 取出存放的数据,完成了 * ( * ( *(m) ) )操作
参考文献
如果有其他问题欢迎留言或邮件提问
QQ:1269112498
Email:1269112498@qq.com
相关文章