《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+-整数,表示对指针的移动。
指针-指针,必须在同一个数组中才有意义,表示两指针中间的元素个数。
关系运算符,必须在同一个数组中才有意义
浙公网安备 33010602011771号