本章将学习C 中最重要的内容–指针。
内存与地址
字符:每存储一个字符所需要的位数,即一个字节byte。通常来说,每个字节包含八个位数,可以存储256个量,表示范围由有无符号决定。每个字节通过地址来标识。
字:将多个字符进行组合,用以表示更大的内存单位,位数通常为32位,可表示较多的整数,但仍只有一个地址。至于该字的地址是最左端字节位置还是最右端字节位置,由各机器决定。
边界对齐:一项硬件事项。在要求硬件对齐的机器上,整型值存储的起始位置只可以是某些特定的字节,通常是2或4的倍数。
需要明确两点:
1.内存中的每个位置由一个独一无二的地址标识;
2.内存中的每一个位置都包含一个值。
如果需要存储一个值,只需要记住它的存储地址,对于C编译器来说,使用名字而不是地址来访问内存的位置。而对于硬件来说,仍然使用地址来访问内存位置。
值与类型
不能简单地通过检查一个值的位数来判断它的类型,若使用整数算术指令,则该数会被解释为整数;反之,使用浮点型指令,则会被解释为浮点数。
指针
指针的初始化是用&操作符完成的,用于产生操作数的内存地址。
int a =112,b =-1;
float c =3.14;
int *d =&a;
float *e = &c;
其中,d和e的内容是地址而不是整型或者浮点数数值。
区分变量d的地址(112)和它的内容(100)是非常重要的,同时也必须意识到100这个数值用于标识其他位置。
仔细想想上面这句话…
存储a变量的地址的指针也有自己的地址
一个变量的值就是分配给这个变量的内存位置所存储的数值。变量的值就是分配给该变量的内存位置所存储的数值,即使是指针变量也不例外。
emmm也就是说,地址已经存储在指针的地址处了。
间接访问操作符
解引用指针的左值与右值问题。
左值的引用:避免对象拷贝–函数传参、返回值
右值的引用:实现移动语义,实现完美转发。
指针并不存在内建的间接访问属性。
未初始化和非法的指针
int *a
...
*a = 12;
/*创建一个名叫a的指针变量,赋值语句把12存储在a所指向的内存位置。
声明一个指向整型的指针都不会创建用于存储整型值的内存空间。
NULL指针
特殊的指针变量,表示不指向任何东西。
那么,为什么要设置这个变量呢一个用于在某个数组中查找某个特定值的函数可能返回一个指向查找到的数组元素的指针。如果该数组不包含指定条件的值,函数就返回一个NULL指针,从而允许返回值传达两个不同片段的信息。
指针、间接访问和左值
int a;
int *d = &a;
指针变量可以作为左值,并不是因为它是指针,而是因为它是变量。对指针变量进行间接访问表示我们应该访问指针所指向的位置。间接访问指定了一个特定的内存位置,可以把间接访问表达式的结果作为左值使用。
*d = 10 - *d;
d = 10-*d;
第一个语句包含了两个间接访问操作,右边的间接访问作为右值使用,所以它的值是d所指向的位置所存储的值。左边的间接访问作为左值访问,所以d所指向的位置把赋值符右侧的表达式的计算结果作为新值。
指针、间接访问和变量
*&a =25;
首先,&操作符产生变量a的地址,它是一个指针常量。接着,*操作符访问其操作数所表示的地址。实际作用是把值25赋值给变量a.
实例计算字符串的长度
/*
**计算一个字符串的长度
*/
#include<stdlib.h>
size_t
strlen(char *string)
{
int length = 0;
/*
**依次访问字符串的内容,计数字符数,直到遇见NUL终止符
*/
while(*string++ !='\0')
length +=1;
return length;
断断续续,还有些指针运算没看太懂,留到下次讲…
最近导师分了个项目,可能更的比较慢…
早点解封吧…