二、指针引发的两个思考

文章详细解释了指针大小通常是4字节或8字节的原因,这与系统的位数有关,确保能表示足够的地址空间。同时,指针的类型不同会影响其操作的内存范围和指针+1的行为,比如指针+1在不同类型的指针中会增加不同数量的字节。文章通过示例代码展示了这些概念。
摘要由CSDN通过智能技术生成

对应的视屏链接鲍松山的个人空间_哔哩哔哩_bilibili


目录

1、指针的大小为什么是4字节或8字节

2、既然指针大小是相同的,为啥还要区分不同类型的指针


1、指针的大小为什么是4字节或8字节

原理:

首先我们先做一个类比,给你 1 位十进制数,你能够编号 10 个数(0~9),如果给你2 位十进制数,则能够编号 100 个数(0~99)……

对于计算机来说,底层所处理的数据都是二进制,一样的方式,给你 1 位二进制,只能编号 2 个数(0,1),给你 2 位二进制,则能编号4 个数(00,01,10,11),

可以试想,如果给你 n 位二进制,是不是就能编号 2^n 的状态。那么,现在,系统是 32 位的,则我们能够编号的范围是 0~2^32,即为 4G 的大小,这样一来,系统为了保证能够访问到任何一个地址,则我们的指针变量所占空间大小最起码需要能够包含所有的地址表示,反过来,要想表示 4G 空间的大小,至少的 4 个字节

因此,指针的大小在 32 位系统下一定是 4 个字节

总结一句话:大了浪费,小了不够

2、既然指针大小是相同的,为啥还要区分不同类型的指针

1、首先这里所说的不同类型,指的是指向的类型

对指针而言,指向的类型是很重要的一个指标

2、决定了指针所能操作的内存范围

#include<stdio.h>

int main()
{
    int a = 0x11223344;

    char *pc = (char*)&a;
    short *ps = (short*)&a;
    int *pi = &a;

    printf("0x%x\n", *pc);
    printf("0x%x\n", *ps);
    printf("0x%x\n", *pi);

    return 0;
}

运行结果:
0x44
0x3344
0x11223344

思考:为什么指针所指类型会决定指针所能操作的内存范围,需要从存储角度来理解

3、决定了指针+1的能力(即指针+1,到底加几个字节)

#include<stdio.h>

int main()
{
    int a = 0x11223344;

    char *pc = (char*)&a;
    short *ps = (short*)&a;
    int *pi = &a;

    printf("0x%p : 0x%p\n", pc, pc+1);
    printf("0x%p : 0x%p\n", ps, ps+1);
    printf("0x%p : 0x%p\n", pi, pi+1);

    return 0;
}

运行结果:
0x00BDF9DC : 0x00BDF9DD     加了1个字节
0x00BDF9DC : 0x00BDF9DE     加了2个字节
0x00BDF9DC : 0x00BDF9E0     加了4个字节

4、指针+1的应用

下面程序结果是多少?

struct BBB
{
    long lA1;
    char cA2;
    char cA3;
    long lA4;
    long lA5;
}*p;
p = (struct BBB*)0x100000;
p + 0x1 = 0x__________
(unsigned long)p + 0x1 = 0x____________
(unsigned long*)p + 0x1 = 0x_____________
(char *)p + 0x1 = 0x_______________
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值