《C和指针》第6章--指针的一些总结

本博客为对《C和指针》第6章--指针的一些总结

 

6.1内存和地址

通过把内存比作街道,房子容纳数据,,并有一个房号来标识。

内存的基本单元是字节,每个字节8个位,每个字节通过地址标识。

但为了存储更大的数据,开始使用字,双字...而字的大小取决于不同系统,

在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit)

在32位的系统中(比如win32)     1字(word)= 4字节(byte)=32(bit)

在64位的系统中(比如win64)         1字(word)= 8字节(byte)=64(bit)

 

接下来应该注意这段话:

 

可以类比为房子的地址是唯一的,在这个唯一的房子中存在一个值/人/...。

(如果了解了这个,接下来的学习就会比较简单???)

 

图一

 

这张图中,上面的数字是内存地址,而下面的则是对应地址中的值。

在C语言/高级语言中使用名称,也就是我们常使用的变量名代替准确的地址来访问。即:

 

图二

 

这些工作是编译器实现的,但硬件依然通过地址访问内存位置。()

 

 

6.2值和类型

 

 

这是对上方图片中变量的声明,其中a,b都符合我们的预期,但在c中有了一些问题,这是因为浮点型的存储方式造成的,在上图中,c是按照整数型读取的,而如果按照浮点型读取则依然是3.14(不排除浮点误差),值的类型取决于值的使用方式。

 

图三

 

6.3指针变量的内容

首先介绍了指针初始化是用&完成获得操作数的地址的。

 

图四

上图强调了d,e中的值为100,108

解释如下:

 

我们可以认为房子d,e中的值为房子a,c的地址。(地址也是一个值)

 

6.4间接访问操作符

 

 

 

 

上图介绍了*(间接访问操作符),并通过例子解释了关于他的使用

*(地址)就是那个地址的值,但如何解读这个值,就看地址是int*/float*/...

接下来作者给出了2张图再次强调指针的值是被指向的数据的地址!!

 

 

注意箭头起始于方框内部,因为它表示存储于该变量的值。同样,箭头指向一个位置,而不是存储于该位置的值。这种记法提示跟随箭头执行间接访问操作的结果将是一个左值。事实也的确如此,我们在以后将看到这一点。

!!(作者已经多次强调,希望我在博客中不会犯这样的问题

 

 

6.5未初始化和非法指针

 

int *a;

*a=12;

 

*a没有初始化,导致a的值随机(指针默认也是自动变量),当我们将12赋给*a时,将不知道12会存储在何处,,如果声明一个 static int *p 则指针会指在0。但无论如何这两种方式都不会创建存储INT型的空间。

如果按照上方运气好将会出现内存错误等而终止程序,但如果指向的是一个合法地址,则那个位置的值被更改,而我们并不知道,当我们寻找错误时这无疑非常麻烦!!!!

6.6NULL指针

使指针指向NULL,则给其赋0,测试指针变量是不是NULL,则将其和0进行比较。NULL在机器内部可能不是0,但编译器会进行转换。

NULL可以表示某指针并没有指向任何东西。

不能不NULL指针进行*操作,结果因编译器不同。

如果已经知道指针将被初始化为什么地址,就初始化为该地址,否则初始化为NULL。

6.7指针,间接访问,左值

 

int a;

int* d=&a;

其中a,d都是变量,所以都为左值,而*d即间接访问指定了一个特定的内存位置,所以其值也是左值。(我们知道了内存位置,就可以改变该位置的值)

*d=10-*d;

d=10-*d;

在第一条语句中右边的*d为右值,代表d所指的地址中的值(a),*d,a,10都为int型。在第二条语句中将int型(10-*d)存在int*中,这并不能自动转换,故会报错。

6.8指针,间接访问,变量

*&a=25;

查表发现*和&优先级相同,从右往左,故*(&a),即间接引用a的地址,故本表达式是将25赋给a;

6.9指针常量

在正常情况下不知道某个变量的地址。但对于寄存器可行

6.10 指针的指针

int a=12;

int* b=&a;

int* c=&b

在第一二条语句我们应该搞定了,而第三条则是c的值为b的地址。*c则是b的值,a的地址。

表达式

等价表达式

a

12

b

&a

*b

12,a

c

&b

*c

&a

**c

12,a,*b

 

 

6.11指针表达式

这里非常精彩,我就直接截图好了

 

 

 

主要就是注意符号优先级,以及a++,和++a

6.12 例子

6.13 指针运算

*p+1会根据指针类型自动调整。

指针运算包括*p+-整数,表示对指针的移动。

指针-指针,必须在同一个数组中才有意义,表示两指针中间的元素个数。

关系运算符,必须在同一个数组中才有意义


 

参考:“一个字等于多少个字节?”是一个不严谨的问法_ECMAScripter的博客-CSDN博客_一个字等于多少字节

posted @ 2022-06-21 07:47  五十载  阅读(71)  评论(0)    收藏  举报