一直在做应用,最近想花一点时间学习一下c/c++,研究的比较浅,求喷求指导
第一篇简单的看了一下指针
解决了一些自己一直以来没有理解的东西,看着没什么干货,不过感觉自己受益颇丰。
一.什么是指针
写了无数遍这样的代码,很久以来都没有懂
#include <stdio.h>
void main(){
int a = 1;
int *b = &a;
printf("a:%d\n", a);
printf("&a:%ld\n", &a);
printf("b:%ld\n", b);
printf("*b:%d\n", *b);
printf("&b:%ld\n", &b);
}
运行结果:
a:1
&a:140736506765324
b:140736506765324
*b:1
&b:140736506765312
结果说明
1.a的值2.a的地址
3.a的地址
4.b的值也就是a的值
5.b的地址
小结一下:(关键是int *这玩意儿就是个数据类型,以前想太多了)
int *为指针类型;
变量b为一个指针类型的变量,他有自己的地址也就是&b(所有变量取值都是*,取地址&);
b赋值的时候其实写的很清楚&a,a的地址;
*b相当于*&a,a的值
就是如此简单啊。
二.指针作为变量的一些属性
上面&a,b,&b这种地址为何这么大,单位是什么(bit?byte?)?怎么玩的呢?既然指针类型是是种数据类型,占多大呢?
这俩问题竟然带出来一系列的问题。。。。
答案:(问题中产生的问题,所以一起找原因了)
32位操作系统:4字节
64位操作系统:8字节
为何会有区别呢?原因是cpu寻址空间大小的改变:
32位最大的寻址空间为2^32=4G=4 294 967 296
64位最大的寻址空间为2^64=2^14T=1.844674407371 * 10 19
由于我是在64位机器上编译的,所以地址都比较大(刚开始玩用整形输出溢出了。。醉)
&a:140736506765324
&b:140736506765312
看到上面的运行结果有疑问:
为啥b比a晚初始化,地址比a小?并不一定是这样的,和系统有关系,有时候是正序去创建地址有时候是逆序(向低位)创建。
其实地址是没有单位的,或者说他根本不是一个需要单位的值,内存中每一个地址表示 1 字节,32位系统的4字节地址容量可以标记4G内存中的所有字节,所以问题在与没有理解地址。。