指针的基本知识

文章介绍了指针的基础概念,包括指针的地址、大小和类型。指针的最小单位是字节,32位系统中指针占4个字节。指针的类型用于规定处理地址时遵循的规则和内存读取的字节数。文章还讨论了指针运算,如自增操作是基于数据类型长度,以及常量指针和指针常量的区别。最后,通过示例解释了多级指针和指针类型转换。
摘要由CSDN通过智能技术生成

我们不会用bit去表达一个数据,因为只能放0和1,能表达的数据太少了,内存地址最小单位是字节

11111111
                                                      0x0011

1字节8bit,8bit才算作一个地址,地址是以字节为最小单位,如0x0011表示这8个小格的地址

指针两要素

1.地址  2.要操作的内存大小

指针的大小

在32位系统中,cpu会通过地址总线在2^32个地址中寻找其中的某一个地址值的数据,所以4个字节的指针就可以代表内存中任意位置的一个地址值,所以指针占4个字节就足够用

所以在32位系统中,所有指针大小位4字节

指针的类型

为什么要有类型的区分呢

是为了告诉编译器,处理这个地址时,必须按照对应类型的规则来处理,声明不同类型的指针变量既是规定了该变量结合指针运算符时读取内存中的字节数,同样规定了在指针移动和指针的运算时(加、减)在内存中移动的最小字节数。

例如定义“int *pa = &a”,取值时,int类型占4个字节,指针就从首地址开始移动,读取4个字节。同理,short类型占2字节,指针就移动2字节。通过声明指针类型,告诉指针每次移动多少字节,来获取变量的值。

思考

long ua	{ 1000 };
long long* uptr	{ (long long*)&ua };
std::cout << *uptr;

这段代码输出了一个很大的负数,是为什么呢?

因为指针的类型仅仅表示该指针指向的变量的内存大小,而不是指针的内存大小,所有指针的内存大小都是4字节。这里是按照long long 型来读取ua的地址,所以是一个很大的值。

知识扩展*:“值相同的两个指针变量”,意思是两个指针变量指向同一个首地址。但是如果指针变量的类型不同,因为指针移动的字节数量不同,就可能读取出不同的数据。

long longlong&ua

long long 和long型指向的地址都是一样的,但是读取方式却不同,long读取了四个字节的内存,long long读取了八个字节,所以,输出后是不同的

指针的运算

指针自增时,加的是1*数据类型的大小

自增是按指针指向的变量的数据类型长度来计算的,与指针本身的内存大小无关

知识扩展*:++优先级高于*,即自增优先级高于间接运算符

多重指针

对于多级指针,可以利用表格来进行运算,更加一目了然

    int array[3]{ 1001,1002,1003 };
	int* ptr{ &array[0] };
	int** pptr{ &ptr };
	*pptr ={ &array[1] };
	std::cout << *ptr;
代码地址
int array[0]    10010x5005
int* ptr0x50050x5006
int **pptr0x50060x5007
*pptr0x5006

常量指针

指向常量内存地址的指针,它指向的常量的内存不能修改,因为是常量,它的指向可以修改

const int a    {1000};
const int b    {2000};
const int *p   {&a};
p=&b;    //可以这么写
*p=2000;  //错误

指针常量

这个指针是一个常量,一旦指向了某个值,它的指向就不能变了,但是里面的值可以修改

const修饰指针又修饰 常量,则两者都不能修改

参考

指针类型和指针类型转换的理解_指针转换_luckyone906的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值