关于指针的一些知识

1.什么是指针:
定义一个指针int *p=&a;其中p叫做指针变量,是一个空间,&a是放在里面的内容,如图所示
关于指针的一些知识

其中的&a叫做指针,即指针即是地址,地址即是指针;

2.为什么要有指针:
在电脑中,数据定义的数据存储在内存中,cpu需要用到时就与内存进行数据交换,内存概念图如下
关于指针的一些知识

内存中以字节为最小单位,每个字节都对应有一个地址;
在32位平台下,内存的最大有效空间为4G,为什么是4G稍后再谈,比如开始一个程序,CPU要在内存中找到一个“开始的命令”,如果没有地址,那么CPU想要找到对应的“开始的命令”就只能大海捞针,将整个4G内存进行访问寻找,这样一来效率就非常低下了;
所以有了地址后寻找目标,就可以直接通过编号(地址),取到储存在对应编号格子里面的数据;

3.为什么32平台下,内存的最大有效空间为4G
关于指针的一些知识

如图:32位CPU和内存之间通过32根地址总线进行数据交流,每根地址线线具有两种电信号,因此可以编扯2的32次方个地址,一个地址对应一个内存上面的小格子(字节),所以内存最大为2的32次方个字节,即4GB;同理在64位系统下最大内存为4GBx2^32;
附:1GB=1024MB=10241024KB=10241024*1024B
B=字节 KB=千字节 MB=兆字节 GB=千兆字节

4.指针(变量)的大小
由上述可知,指针(变量)是储存地址的变量,定义一个变量即需要开辟出来一个空间,这个空间里面储存的是地址,地址由32比特位构成(从0x00000000-0xFFFFFFFFF),因此储存一个地址需要32个比特位,8比特=1字节,所以指针变量在32位操作系统下的大小统统为四个字节;

5.指针的类型
通常我们定义一个变量a:int a; char a; double a等; 定义的时候可以选择不同的类型,那么指针同样具有类型,对比上述为:int *p=a;char *p=a; double p=a;
可知指针定义的方式为 type+
;显而易见指针的类型是为了存放对应类型变量的地址,那么类型对于指针本身有什么意义呢?
5.1.指针的意义
1.如图
关于指针的一些知识

定义两个不同类型的指针,同时对其+上1;由图可知,对int类型的指针+1得出的地址比&a大4个字节,对char类型的指针+1,比&a大1个字节;
扩展:那么给二级指针int **pp加+1呢,由指针类型构成type+*,二级指针的类型构成为 int +,即二级指针的类型为 int *,类型为指针那么大小当然为4个字节了;同理,3级4级指针的类型大小统统为4个字节;(在32平台下)
总结:对指针+1就是加上指针指向类型的大小,即给指针+1,就是给指针+sizeof(type);

2.再看图
关于指针的一些知识

p和q分别赋值为0,由图可知,char类型指针赋值后只是将a内容中第一个字节的内变为0,而int类型的指针赋值后将整个内容都赋值为0;
由上述可知,指针的类型决定了对指针解引用时后的权限有多大,比如,char类型为1个字节,int类型为4个字节;

6.指针的运算
6.1指针加减整数关于指针的一些知识

由图可知,定义了一个具有5个元素的数组,&arr[5]指向的是第6个元素,但是用指针与其比较时,是允许的;

但是当改写成下图所示,与第一个元素之前的那个位置的内存进行比较便不允许了

标准规定:允许数组元素的指针与指向数组最后一个元素的后面的那个位置的内存进行比较,不允许与指向第一个元素之前的那个位置的内存进行比较。
这就是for循环中为什么常常写前闭后开的原因;

6.2指针-指针
关于指针的一些知识

q-p=9; q和p之间有36个字节,int类型为4个字节,36/4=9;
而设立区间 [0,10)时,指针指向的是最后一个元素的下一个元素,即指在了第10个元素的最大地址而不是最小地址,q-p=10,整个数组元素的个数就出来了,这就是前闭后开的意义;

q-p=18;q和p之间有36个字节,short类型为2个字节, 36/2=18;
关于指针的一些知识

end指向的是‘\0’,是字符串最后一个有效元素的下一个元素,str是第一个元素的地址,前闭后开,相减为字符串长度;
总结:
1.指针进行比较时,通常指向同一块内存(比如同一数组,字符串);不然没有意义;
2.指针相减,代表两指针之间经历的元素(元素的类型由指针表明);
3.指针加减整数也常有;
4.指针加指针没有意义;

7.指针和数组
先导出结论:指针和数组毫无关系,只是在访问上有一些雷同;
7.1为什么没有关系数组传参会降维成指针呢?
数组名除了单独在sizeof中出现以及取地址时表示整个数组,其余情况下都代表首元素的地址。
这就不难理解,数组传参时,传的是数组名,即传的是地址,地址就是指针,所以说数组传参发生降维,降维成指针。形参实例化需要大量的拷贝,降低效率,降维成指针后就不需要这种大量的拷贝,提高了运行效率; 从效率角度或者基本与法角度都说明了数组传参为什么需要降维

7.2数组和指针的雷同点

如图;关于指针的一些知识

1.四种方式都是访问数组的元素,结果都一样,方法2是从1衍化化出来的,方法3是从4衍化出来的
2. 法1和法4,法2和法3的区别在与法1是先找到指针中对应的地址,对其+1再进行解引用,而法4是直接地址+1再解引用,少了一个寻址的过程

8.二级指针
指针变量也是变量,也会有地址,那么它的地址由谁来储存呢,显而易见也是指针即二级指针;
关于指针的一些知识

如图:指针p里面装的是a的地址,2级指针里面装的是p的地址,对二级指针解引用代表指向其所指向的目标即p,p里面为a的地址,再解引用那么就是对p再解引用即是a了;

文章寡漏,请多多指教;