谈论指针(一)

本文介绍了计算机科学中的指针概念,解释了它是如何通过地址指向内存中的值,并通过实例展示了指针的基本用法。

(1)指针是什么?

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元 在高级语言中,指针有效地取代了在低级语言,如汇编语言与机器码,直接使用通用暂存器的地方,但它可能只适用于合法地址之中。指针参考了存储器中某个地址,通过被称为反参考指针的动作,可以取出在那个地址中存储的值。作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。

(2)指针的第一个小应用

如何从形式上理解指针

(*p)操作是一种运算,返回p值作为地址那个空间的取值

(&p)操作也是一种运算,返回声明p时p的地址

来理解一下第一种的应用(*p)

假设p分配空间时被分配给了3001H和3002H两个位置

int *p;

p=2003H;

*p=3000H;

第一问**p的值为多少

这个问题可以这么看,字母最近原则,先算(*p)也就是*(2003H),然后再算*(*(2003H))然后就得出一个结论*(*(2003H))=*(3000H)等于同一个值

我是这么理解的,本来有这么一个p然后将一个地址值赋给它,*p去到这个地址中找,又找到了一个地址3000H,**p就是到这个地址中再去找值,恩就这样

第二问&&p为多少?

同样的就近法可以得到这么一个等式&(3001H)此时应该报错3001H这个地址怎么会有地址呢?

第三问*(&p)为多少?

*(3001H)=2003H

第四问&(*p)为多少?

&(3000H)=2003H &(3000H)是求3000H这个变量的内存地址,依然是p的值




<think> 我们正在谈论指针的大小。根据引用[2]和引用[3],指针的大小实际上是由CPU的寻址位数决定的,而不是由字长决定。 在32位系统中,CPU的寻址空间是4GB(2^32),所以指针的大小是4字节(32位)。 在64位系统中,CPU的寻址空间更大(理论上1800万TB),所以指针的大小是8字节(64位)。 注意:无论指针指向什么类型(int, char, double等),指针本身的大小只与系统的寻址能力有关,与指向的类型无关。 例如,在32位系统中,int*、char*、void*等所有类型的指针都是4字节;在64位系统中,所有类型的指针都是8字节。 引用[1]中的C++程序可以验证这点:在同个系统中,不同类型的指针大小是相同的。 因此,我们可以总结: - 32位系统:指针大小为4字节 - 64位系统:指针大小为8字节 但是,需要注意的是,指针所指向的数据类型的大小是不同的(例如,char是1字节,int通常是4字节,double是8字节等)。而指针变量本身存储的是个地址,因此它的大小由系统决定。 下面用引用[3]中的代码说明: - 输出指针变量的大小(sizeof(p1)、sizeof(p2)等)在32位系统下都是4,在64位系统下都是8。 - 而输出指针解引用后指向的数据的大小(sizeof(*p1)、sizeof(*p2)等)则是指向类型的大小。 所以,回答用户的问题:指针的大小取决于系统是32位还是64位,32位系统是4字节,64位系统是8字节。 我们可以用LaTeX表示: 在32位系统中,指针大小 = $4$ 字节 在64位系统中,指针大小 = $8$ 字节 引用[2]中提到:指针的大小实际上是由CPU的寻址位数决定。32位寻址的CPU,指针大小为4字节;64位寻址的CPU,指针大小为8字节。 最后,在回答中需要引用相关引用。 </think> ### 指针大小的详细解释 指针的大小由**系统的寻址位数**决定,而非指针指向的数据类型。这是理解指针存储的核心原则: #### 1. **指针大小的决定因素** 指针本质是存储内存地址的变量。其大小取决于CPU的**最大寻址空间**: - **32位系统**:最大寻址空间为 $2^{32}$ = 4GB,地址用32位(4字节)表示 $$ \text{指针大小} = 4 \text{字节} $$ - **64位系统**:最大寻址空间为 $2^{64}$ ≈ 16EB(艾字节),地址用64位(8字节)表示 $$ \text{指针大小} = 8 \text{字节} $$ 此特性与指针类型无关(无论 `int*`、`char*` 或 `void*`),验证代码: ```cpp #include <iostream> int main() { std::cout << "int* 大小: " << sizeof(int*) << " 字节\n"; // 输出相同 std::cout << "char* 大小: " << sizeof(char*) << " 字节\n"; // 输出相同 std::cout << "void* 大小: " << sizeof(void*) << " 字节"; // 输出相同 return 0; } ``` **运行结果**: - 32位系统:所有指针输出 `4` - 64位系统:所有指针输出 `8`[^1][^3] #### 2. **指针大小与数据大小的区别** 需区分指针本身和其指向的数据: ```c int* p; // 指针p的大小由系统决定(4或8字节) sizeof(*p); // 解引用后得到int类型大小,固定4字节(与系统无关) ``` - **指针变量**:存储地址,大小由寻址空间决定 - **指向的数据**:大小由数据类型决定(如 `char` 为1字节,`double` 为8字节)[^3] #### 3. **根本原因** CPU的寻址位数直接决定地址值长度: - 32位CPU:地址寄存器为32位 → 指针需4字节存储 - 64位CPU:地址寄存器为64位 → 指针需8字节存储 这是硬件层面的设计约束[^2]。 #### 4. **特殊情况说明** - **函数指针**:大小同样遵循上述规则 - **多级指针**(如 `int**`):每级指针额外增加寻址空间对应的字节 - **结构体中的指针**:按独立指针大小计算 > **关键结论**: > $$ \text{指针大小} = \frac{\text{CPU寻址位数}}{8} \text{字节} $$ --- ### 快速验证实验 在64位Linux系统编译并运行以下代码: ```c #include <stdio.h> int main() { printf("系统指针大小: %zu 字节\n", sizeof(void*)); printf("理论寻址空间: 2^%zu \n", 8 * sizeof(void*)); return 0; } ``` **输出**: ``` 系统指针大小: 8 字节 理论寻址空间: 2^64 ``` 此结果印证了指针大小与寻址空间的直接关联[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值