C和指针(第六章)

最近这几天,书的毛 都没碰…沉迷于小说的世界无法自拔,虽然我们都不是作者笔下小说中的主角,但是我们可以做自己生活的主角,我始终相信着自己是自己的主角,无论情况再差,现实再残忍.

6.1内存和地址
<1>一个’字’通常包含四个(或两个字节),每个字节包含八个位,每个位存放0或者1,这样一个字就可以表示02^32-1(无符号整形),或-2^32-12^32-1.
<2>我们定义的变量的名称和里面储存的数值的对应关系是由编译器决定的,不是硬件.但是硬件还是通过地址访问内存位置

6.2值和类型
<1>不可以简单的通过检查一个值的位来判断它的类型,这取决于编译器的解释指令,若是解释为整形算术指令,就是整形,若是解释为浮点型算术指令,就算是浮点数类型.

6.3指针变量的内容
指针变量的内容存的是地址,通过访问地址来访问它指向的内容
int p=10;
int *a=p;
cout<<*a;

6.4间接访问操作符
'*a’这种东西是通过一个指针a来访问a所指向的内容,a本身存放着所指向变量的地址

6.5未初始化和非法的指针
int *a;

*a=12;
那么a到底指向了哪里呢?,如果运气好,编译器会报错,否则可能会导致很严重的后果,比如,万一指针指向了一个你已经创建的变量怎么办?你在debug的时候可能会 心态炸裂 极度难受~~~

6.6NULL指针
标准的NULL指针,不指向任何东西,要是一个指针为NULL,你可以赋值为0,比如
int *a=NULL;

int a=0;
这两个语句等价
如果你访问
a的话,一般会出错,更重要的是,不要访问NULL!!!
不论如何,所有指针变量的初始化都应该自己来写,为了程序一遍通关,怎么可以偷懒呢?!

6.7指针.间接访问.左值
间接访问操作符所需要的操作数是个右值,但是它的返回值是个左值,我们看看下面这个例子
int a;
int *d=&a;
a,d,*d,都是左值,指针变量可以作为左值并不是因为他们是指针,而是因为他们是变量。
比如
*d=10-*d //正确
d=10-*d; //错误
错误原因:10-*d这个值是一个整形变量,他无法把一个整形变量存储到一个指针变量里面.

6.8指针,间接访问,变量
*&a=25;
表示的是将25赋值给a

6.9指针常量
100=25;
这样的写法是错的,没想到吧?!!!因为100是字面值,间接访问符"
"只可以作用在指针类型表达式,如果你真的想把25存储在
100的位置上,(int)100=25;
当然了,这样的装13的机会几乎没有,因为你也不在乎100这个位置装的是啥…QVQ

6.10指针的指针
int a=23;
int *b=&a;
int **c=&b;
这个对于初学者还是有难度的,建议大家去找找别的博客(百度搜索:二重指针CSDN)

6.11指针表达式
<1>左右值区分: lvalue(locator value)代表一个在内存中占有确定位置的对象(换句话说就是有一个地址)。
rvalue通过排他性来定义,每个表达式不是lvalue就是rvalue。因此从上面的lvalue的定义,rvalue是在不在内存中占有确定位置的表达式。

<2>骚操作:*++cp *cp++ ++*cp (cp)++ ++++cp ++*cp++
不管你眼花没有,反正我是眼花了…

在这里插入图片描述
在这里插入图片描述
精髓:后缀加加操作符优先于操作符,计算机默认从右向左读取,++cp,先是操作,再是++操作 ++++cp也是先++cp,指针指向下一个对象,返回它的值,在让返回值+1