指针进阶内容
指针的大小是4个字节或者8个字节 ,主要看系统类型,当为32位机器时为4个字节 64位为8个字节
我们口语上的指针就是所谓的指针变量,里面存储的其实是地址
指针的类型决定了,他们在访问地址时的权限,比如char *一次只能访问一个字节的内存 ,而int *一次性能访问 4个字节 double 为8个字节的内存
%c
是打印字符,%s是打印字符串
%s其实就是打印到\0就不打印了
本质上这种写法存的还是 存的字符串首字符的地址
但是弊端就是不能修改 如果修改会发生错误
因为当你创建出这个指针时,他就被放到到只读区,而无法被修改。因此在创建这种指针变量时最好给前面加一个const 就可以避免这种弊端了 这样可以增加代码的可读性
下面为一个经典例题
为什么会出现上面的地址是相等的 而下面的字符串是不相等的呢?这是因为 这还是涉及到一个东西
上面那个属于常量字符串 ,在创建时不会重复创建 ,因此其实p1 p2 这两个指针变量都是保存的这个常量字符串的首字符 a的地址 ,故他俩是相等的
下面那两个字符串是因为字符串在创建时就在内存中申请了空间,且这两个空间地址不同,所以不相等
-------------------------------------指针数组
指针数组主语为数组,所以这是一个数组,里面存放的是指针
int * arr[] 可以类比一下整形数组 int arr[] 也是说明存放的是整形
int *说明存放的是地址
指针数组模拟二维数组
虽然可以模拟出二维数组的形式,但是本质上不是二维数组 ,因为二维数组在内存中i是连续存放的
所以说 这就是指针数组的用途
----------------------------------------------------数组指针
主语为指针,实质上,数组指针的本质为指针
要怎么用呢/?,必须将数组名再次进行。理解一下,加深印象
数组名为首元素地址
有两种特殊情况,这两种情况说明 arr不一定为首元素地址
比如 sizeof (数组名)
&数组名
这两种情况表达的是整个数组
必须是单独 sizeof 单独放一个数组名 ,这个时候才表示整个数组,。计算的是整个数组的大小
数组指针用来存放数组的地址 比如 &arr
数组指针是用来存放整个数组的地址
数组去掉名字,剩下的就是 类型
数组指针的形式为 int (*arr)[]; 指针数组的形式是 int *arr [];
注意区别。