指针小知识

1.一个指针变量占用多少个字节的内存空间?占用的空间是否会跟随所指向变量的类型而改变?

在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境下,任何一个指针变量都只占用2个字节,并不会随所指向变量的类型而改变。

 

2.既然每个指针变量所占用的内存空间是一样的,而且存储的都是地址,为何指针变量还要分类型?而且只能指向一种类型的变量?比如指向int类型的指针、指向char类型的指针。

其实,我觉得这个问题跟"数组为什么要分类型"是一样的。

* 看下面的代码,利用指针p读取变量c的值

复制代码
1 int i = 2;
2 char c = 1;
3 
4 // 定义一个指向char类型的指针
5 char *p = &c;
6 
7 // 取出
8 printf("%d", *p);
复制代码

这个输出结果应该难不倒大家:,是可以成功读取的。

如果我改一下第5行的代码,用一个本应该指向int类型变量的指针p,指向char类型的变量c

int *p = &c;

我们再来看一下输出:c的原值是1,现在取出来却是513,怎么回事呢?这个要根据内存来分析

根据变量的定义顺序,这些变量在内存中大致如下图排布:

其中,指针变量p和int类型变量i各占2个字节,char类型的c占一个字节,p指向c,因此p值就是c的地址

1> 最初的时候,我们用char *p指向变量c。当利用*p来获取变量c的值时,由于指针p知道变量c是char类型的,所以会从ffc3这个地址开始读取1个字节的数据:0000 0001,转为10进制就是1

2> 后来,我们用int *p指向变量c。当利用*p获取变量c的值时,由于指针p认为变量c是int类型的,所以会从ffc3这个地址开始读取2个字节的数据:0000 0010 0000 0001,转为10进制就是513

可见,给指针分类是多么重要的一件事,而且一种指针最好只指向一种类型的变量,那是最安全的。


<think>好的,我需要回答用户关于C语言指针大小、平台和数据类型关系的问题。首先,我得回忆一下相关知识。根据引用[2],指针变量本身的类型决定了它指向的数据类型,但所有指针类型的变量都占4字节。不过这可能是指32位系统的情况,对吧? 用户提到指针大小平台的关系。我记得不同位数的系统,地址总线长度不同,所以指针大小会变化。比如,32位系统指针是4字节,64位系统是8字节。这点需要确认。引用里没有明确提到64位的情况,但根据常识,这是正确的。 然后是指针的数据类型。虽然指针类型决定了如何解析指向的数据,但指针变量本身的大小平台有关,类型无关。例如,int*、char*、double*在同一个平台下大小相同。引用[2]里也提到所有指针类型的解析方式相同,都是地址,占4字节(应该是在32位系统中)。 需要说明指针类型的作用,比如类型转换、指针运算等。比如,指针加减操作时,步长由数据类型决定。这部分用户可能也会关心。 最后总结指针大小由平台决定,数据类型影响解析和运算。需要确保引用正确,用[^2]来支持关于指针类型大小关系的部分。可能还要提到引用[3]强调指针的重要性。 现在组织回答结构:先总述指针大小由平台决定,再分点解释平台影响和数据类型的作用,最后总结。确保使用正确的LaTeX格式,比如$4$字节、$8$字节。同时生成相关问题,覆盖指针类型、转换、运算等。</think>在C语言中,指针大小指向的数据类型无关,而是由平台的架构决定。以下是具体分析: ### 1. **指针大小平台的关系** - **32位系统**:指针大小为$4$字节(32位地址总线,可寻址$2^{32}$个内存单元)[^2]。 - **64位系统**:指针大小为$8$字节(64位地址总线,可寻址$2^{64}$个内存单元)。 - 无论指针类型是$int*$、$char*$还是其他类型,所有指针在相同平台下的存储大小相同。 ### 2. **指针的数据类型作用** - **类型决定解析方式**:指针类型决定了如何解释指向的内存数据。例如: - $int* p$表示$p$指向的内存按$4$字节整数解析; - $double* p$则按$8$字节浮点数解析。 - **类型影响指针运算**:指针加减操作时,步长由数据类型大小决定。例如: - $p+1$的地址偏移量为$sizeof(int)$; - 若$p$是$double*$,则偏移$sizeof(double)$。 ### 3. **示例验证** ```c #include <stdio.h> int main() { printf("int*大小: %zu\n", sizeof(int*)); printf("char*大小: %zu\n", sizeof(char*)); printf("void*大小: %zu\n", sizeof(void*)); return 0; } ``` 输出结果在64位系统中均为$8$字节,32位系统中均为$4$字节。 ### 总结 指针大小仅由平台架构决定,而指针类型的作用是规范内存访问的语义和运算逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值