一、指针概述
1、指针定义
指针是寻找内存类型资源地址、门牌号的代名词
指针变量是存放指针这个概念的盒子
eg:int a;
a就叫作整型类型的变量。定义了一个int大小的盒子(当前主流的编译器和系统,int类型通常占用4个字节的存储空间)
2、思考问题
C语言编辑器对指针这个特殊的概念,有两个问题?
看到*p就要想到以下两个问题:
1、分配一个盒子,盒子要多大?
盒子大小要能容纳内存地址最大容量。
在32位系统中,盒子的大小是4个字节,在64位系统中,盒子的大小是8个字节
盒子有了,第二步就是如何用这个盒子,就比如在32位系统中,定义一个指针去读取地址,是读取1B,还是4B呢,所以很容易想到第二个问题。
2、盒子里存放的地址所指向内存的读取方式是什么?
当程序通过指针变量Indirectly访问所指向的内存时,编译器需要根据指针类型生成正确的内存访问代码。比如指针p指向一个int变量,那么*p表示访问p所指向内存中实际的int变量。编译器会根据int的大小和系统访问内存的方式,生成加载或存存储位于p中的地址处的整数值的具体机器码。
简单来说当我们定义了char *p,就告诉编译器一次性只读一个字节。int *p就是4个字节等等。
二、举例说明
int n = 10;
int* p = &n;
printf("%d", *p);
这里有一个int变量n,和一个指向n的int指针p。
编译器处理这个代码的主要步骤是:
1. 为整数变量n在内存中分配4个字节空间(假设int为4字节)
2. 为指针变量p在内存中分配足够存储一个地址的空间,比如4字节或8字节
3. 将n的地址赋值给指针变量p
4. 当遇到*p时,编译器了解p是个int指针,需要读取p中的地址所对应的内存
5. 根据int的大小是4字节,编译器生成加载存储在p中的地址处4个字节整数值的机器指令
6. 最后这4个字节的值就是n的值10,被打印输出所以编译器是通过指针类型,指针所指向变量的大小,以及系统的内存访问方式,来生成正确的读取指针所指向内存的机器代码的。这就实现了指针间接访问内存的机制。