关于指针占内存情况

指针的长度就是机器的地址长度,绝大部分情况下跟字长也相符。例如32位机就是32位的指针出长度,换算一下就是4个字节,64位机器上就是8字节,当然也需要CPU,操作系统和编译器的配合才能得到准确的值。就像32位机器上还可以用TC这种16位的编译器,32位的windows可以模拟16位dos环境,32位的x86也可以兼容16位的8086,所以在win32下用TC编译程序就是16位指针。同理在64位的windows下也可以兼容执行32位程序。
以上

struct all
{
    struct all *next;
    int a,b,c;
}rec;
int main(void)
{
 int *a=NULL;
    printf("The size of rec is %d,/n"
              "and the size of int type is %d/n"
                 "and the size of  all.next is %d/n "
        "and the size of a pointer is %d/n",
                     sizeof(rec),sizeof(int),sizeof(a),sizeof(rec));
   
    getchar();
    return 0;
}

 

输出结果为:

The size of rec is 16,
and the size of int type is 4
and the size of  all.next is 4
 and the size of a pointer is 16

<think> 我们正在讨论指针占内存大小及影响因素。根据引用[2],指针占内存大小是基本数据类型大小的一部分,但具体大小取决于系统架构和编译器。以下将分步骤解释: 1. **指针的本质**: 指针是存储内存地址的变量。其大小不取决于指向的数据类型(如`int*`、`char*`等),而取决于系统的寻址能力。例如,在32位系统中,指针通常占4字节(32位);在64位系统中,通常占8字节(64位)[^2]。 2. **影响因素**: - **系统架构**:主要决定因素。32位系统的地址总线为32位,故指针大小为4字节;64位系统为8字节。 - **编译器实现**:少数编译器可能因优化调整指针大小,但绝大多数遵循系统架构标准。 - **指针类型**:`void*`、`int*`等不同类型的指针大小相同,因为地址存储需求一致。但指向成员函数的指针(C++)可能更大(含类信息)。 - **操作系统限制**:例如Windows x64程序使用48位虚拟地址,但指针仍为8字节存储。 3. **验证方法**(C/C++示例): ```c #include <stdio.h> int main() { printf("int* size: %zu\n", sizeof(int*)); // 输出指针大小 printf("char* size: %zu\n", sizeof(char*)); return 0; } ``` 在64位Linux系统运行结果通常为8。 4. **特殊指针**: - **函数指针**:大小普通指针相同(如4或8字节)。 - **成员函数指针(C++)**:可能更大(例如16字节),因其需存储额外信息(如虚函数表偏移)[^2]。 - **多重指针(如`int**`)**:仍为4或8字节,因存储的是地址的地址。 5. **数据大小的区别**: 指针大小≠指向数据的大小。例如`int*`在64位系统中占8字节,但指向的`int`可能占4字节。 **总结**:指针内存大小由系统寻址空间决定: - 32位系统:$4$ 字节 - 64位系统:$8$ 字节 例外情况较少(如C++成员函数指针)。设计程序时需注意此特性以避免资源浪费或错误。 §§相关问题§§ 1. 如何在不同系统中编写跨平台指针操作代码? 2. C++中成员函数指针普通函数指针有何区别? 3. 指针占用内存大小对程序性能有哪些影响? 4. 如何通过指针优化内存使用效率? 5. 指针在数据结构(如链表)中的内存布局是怎样的? </think>### 指针占内存大小及影响因素 指针在内存中的大小主要由系统架构决定,以下是关键分析: #### 1. **基本大小规则** - **32位系统**:指针固定占 **4字节**(32位寻址空间) $$ \text{地址范围} = 2^{32} \approx 4\text{GB} $$ - **64位系统**:指针固定占 **8字节**(64位寻址空间) $$ \text{地址范围} = 2^{64} \approx 16\text{EB} $$ 无论指向何种数据类型(`int*`/`char*`等),所有普通指针大小均相同[^2]。 #### 2. **影响因素** | 因素 | 说明 | 示例 | |------|------|------| | **系统架构** | 核心决定因素 | 32位系统=4B, 64位系统=8B | | **指针类型** | 普通指针大小统一 | `int*``float*`大小相同 | | **编译器实现** | 极少情况下可能特殊优化 | 嵌入式系统中可能压缩 | | **成员函数指针(C++)** | 含类信息会更大 | 可达普通指针的2-3倍[^2] | #### 3. **验证代码示例 ```c #include <stdio.h> int main() { printf("int* size = %zu\n", sizeof(int*)); printf("char* size = %zu\n", sizeof(char*)); printf("void** size = %zu\n", sizeof(void**)); return 0; } ``` 64位系统典型输出: ``` int* size = 8 char* size = 8 void** size = 8 ``` #### 4. **内存对齐影响** 虽然指针本身大小固定,但在结构体中会影响整体内存布局: ```c struct Example { char c; // 1字节 int* p; // 8字节(64位系统) }; // 总大小=16字节(含对齐填充) ``` 由于内存对齐要求(通常按$max( \text{成员大小} )$对齐),结构体大小可能大于成员总和[^1]。 #### 5. **特殊场景** - **函数指针**:大小普通指针相同 - **智能指针(C++)**:`std::shared_ptr`等包含控制块,通常为普通指针2倍 - **多级指针**:`int**``int*`大小相同(均存储地址) **总结**: 指针内存大小由系统寻址空间决定,指向类型无关。在64位系统中恒为8字节,32位系统中恒为4字节。设计数据结构时需考虑其对内存对齐的影响[^1][^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值