指针即地址
每个字节都有一个地址,一个最小的单位就是字节
共有2的32次方个地址,每个地址对应一个字节
为什么最小单位不是位(bit)呢?
我个人理解为:
如果每个位都占一个地址的话,那内存一下子就满了! (地址数量有限)
(比如一个整型数字占4个字节,用位的话要分配32个地址...容易造成浪费)
32位上,每8位为1个字节,共4个字节,每4位(bit)组成一个16进制数,所以地址用16进制时呈现8位 (每2位为1个字节) 如:11111111 11111111 11001100 10101011 ==> ff ff cc ab
所以指针大小为4个字节(即有32位),取地址时呈现出第1个字节的地址
64位上,每8位为1个字节,共8个字节,每4位(bit)组成一个16进制数,所以地址用16进制时呈现16位 (每2位为1个字节) 如:11111111 11111111 11001100 10101011 11111111 11001100 10101011 10101011 ==> ff ff cc ab ff cc ab ab
所以指针大小为8个字节(即有64位),取地址时呈现出第1个字节的地址
指针的定义和使用
1.定义指针
int a = 10;
int * p; //基类型/数据类型*指针变量名
//p的意思是point,也可以自定义其他字符表示
//p是一个指针变量,*p表示p指向的对象
p = &a; //让指针记录变量a的地址
//此行也可以和上面那行代码合起来一起写成:int* p = &a;
cout << "a的地址为:" << &a << endl;
cout << "指针p为:" << p << endl; //这两行打印输出的结果是一样的
2.使用指针
可以通过解引用的方式来找到指针指向的内存
指针前加*代表解引用,找到指针指向的内存中的数据
*p = 1000;
cout << "a =" << a << endl;
cout << "*p =" << *p << endl; //这两行打印输出的结果也是一样的
指针的作用
1.可以通过指针间接访问内存
内存编号是从0开始记录的,一般用十六进制数字表示
如果要用十进制查看其编号,则在前面用 (int) 转换
2.可以利用指针变量保存地址
指针一些值得注意的点
1.指针也是一种数据类型,根据所指的对象的类型可分为:
整型指针 int*, 字符型指针 char*, 数组指针 int * [ ] 等
2.无论指针指向哪种数据类型,指针所占的字节空间都是4/8个(32位/64位)
3.指针类型决定了:指针解引用时权限的大小
如int*解引用后,访问权限有4个字节,char*则只有1个字节
指针自加时,int*向后移4个字节,char*向后移1个字节
4.指针相加没有意义(两个地址,内存空间不同也无关联,相加无意义)
指针相减得到之间的元素个数(通常在数组里会用到该方面的知识,如数组array+5减去array+3,得到中间的元素个数为2,其中array是数组名,表示数组首元素的地址)
指针 与 内存 地址 数据 解引用 之间的关系
(我打个比方可能比较容易理解~)
内存是房子,地址是门牌号,数据是房子里的物品
地址 和 指针, 是同一个东西,都相当于门牌号
解引用类似于开锁,指针p只是指向地址,*p则开锁,可以访问内存(走进屋子)获得数据(拿到物品)