指针——内存和地址

刚刚看了篇博文: 北大硕士开米粉店,3个月后的最大收获与感悟是

里面的一些词,让我很触动,很有共鸣感,

“书生式的无病呻吟”:确实,好像有很多时候觉得自己已经很苦逼了,可是看看那些在社会上用自己的双手为生计打拼的人,拿着国家津贴,父母的钱,却连最基本的学习都觉得苦,真是羞得无地自容啊!

“理解和尊重”。。。不说废话了,下面记叙C语言的指针,一来知道指针是C语言的灵魂,二来,近来学习数据结构和算法,里面有很多指针的操作,理解还是有点困难呀!

1.计算机的内存由位(bit)组成,每个位可以容纳值0和1.

即:计算机内存的最小单位就是:位(bit)

2.现实计算机的内存以字节(byte)为单位(bit太小啦!),每个字节8位,存储无符号值:0~255,或有符号值:-128~127

3.指针的声明:int *p = &a (要死这都快忘了,p的值是a的地址,*p是a的值,其实可以拆成两句:int *p;(声明一个指针变量)p = &a;(指针变量赋值))

4.变量的值就是分配给该变量内存位置所存储的数值。(爱死这句话 )

5.指针一定要初始化,即给定它所指向的位置。一般初始化:int *p;p = NULL(表示特定指针P目前并未指向任何东西。)(当不确定指针指向何地址,

如果地址确定,则将p直接赋值为该地址)

6.p = 10 -*p 是非法的,因为它将一个整形数量(10-*p)存储与一个指针变量中。

7.假定a存储于位置100,则*100 = 25;

注意!注意!注意!(时至今日才明白这点)

这个表达式是非法!理由:指针操作是间接访问的方式,而间接访问操作只能作用于指针类型表达式,而字面值100的类型是整型。!不是指针类型!

如果你想把25存储与位置100,则必须使用强制类型转换。

*(int *)100 = 25(这种方法基本不用,也不建议使用

8.指针的指针(其实指针啊指针啊,也就是指针变量,归根结底就是个变量,先声明,在定义。

没有什么太大的不同,只是指针变量的存放的是其他数据的地址值而已,也就是隐性的存在一种指向关系,间接访问)

指针的指针,一层层的剥,首先它是一个指针,其次复杂的,它指向的也是一个指针啦!

哎呀妈呀,想画张图,结果又一次发现自己是弱爆了!

还是先上干巴巴的代码先:

int   a = 12;
int   *b = &a;
int   **c = &b;   #*操作符具有自右向左的结合性

代表的意义:

表达式 相当的表达式
a 12
b &a
*b a,12
c &b
*c b,&a
**c *b,a,12

9.&a不能作为左值。优先级表格显示&操作符的结果是个右值,它不能当作左值使用。

理由:当表达式&a进行求值时,它的结果应该存储于计算机的位置是未知的。这个表达式并未表示任何机器内存的特定位置,因此无法对其进行赋值。

暂且记下这么多,指针博大精深。。有待更加深究。。

                                                                                                                                                                                                                                               

原文地址:https://www.cnblogs.com/shixiaomiao/p/4019309.html