8指针2

Posted liugangjiayou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8指针2相关的知识,希望对你有一定的参考价值。

指针变量也是变量

1. 深入理解:指针变量的类型

int *p;

根据 p 变量中的内容,我们可以找到一个存储区的首地址,然后再根据 p 的类型,就可以确定要取几个字节中的内容了。

int a = 0x61626364;
int *p = &a;
char *q = (char *)&a;
printf("%x %c
", *p, *q);

这段上面代码中,p 和 q 同时指向了 a 变量的存储区。而取值 p 和取值 q 的结果,却截然不同。这是因为,取值 p 时,程序会从 p 所指向的首地址开始,取 4 个字节的内容作为数据内容进行解析,而取值 q 的时候,则是取 1 个字节的内容,作为数据内容进行解析。

技术图片

如图所示,p 变量对应了 a 变量整个存储区中的内容,所以输出取值 p 和 a 原本存储内容相同。而 q 变量由于是字符型指针变量,只能从首地址取到 1 个字节的内容,取到的就是 64,这里的 64 注意可是 16 进制的数字,对应到 10 进制数字就是 100,而 %c 是输出一个字符,数字 100 对应的字符就是英文小写字母 ‘d’。

int a, *p = &a;
char *q = &a;
printf("%p %p", p, q);
printf("%p %p", p + 1, q + 1);

技术图片

指针变量类型的第二个作用:在加法或者减法时,确定增加或者减少的地址长度。

2. 指针变量与数组

参与运算的是值,不是变量名!

地址才是参与运算的值,指针只是存储地址值的变量,只是一个容器。所以,不是指针支持加减法操作,而是地址这种类型的值,支持加减法操作。

技术图片

从上图的等价表示中,你可能会自己推导出另外一种等价表示 *(p + 5) 等于 arr[5]。我希望你重视等价表示的学习,因为所谓等价表示,就是在写程序的时候,多种等价表示,写哪一种都一样。这就造成了,不同的编码习惯,会用不同的符号来完成程序,如果你不理解这些等价的表示方法,很有可能在看别人程序的过程中,就会出现看不懂的现象。

3. 指针变量的大小

类型就是指针变量的职业

放到指针变量的概念里,那就是不管什么类型的指针,指针所改变不了的是其占用空间的存储大小,因为不管是什么类型的指针,存储的都是无差别的地址信息。

小结

  1. 指针的类型,决定了指针取值时所取的字节数量。
  2. 指针的类型,决定了指针加减法过程中,所跨越的字节数量。
  3. 无论是什么类型的指针,大小都相等,因为地址信息是统一规格的。

以上是关于8指针2的主要内容,如果未能解决你的问题,请参考以下文章

ES7-Es8 js代码片段

片段中的 EditText 上的空指针异常 [重复]

VSCode自定义代码片段8——声明函数

在tablayout片段之间进行通信[重复]

片段中的空指针异常

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常