指针那些事儿~~

“指针”一直以来都是初学者理解和掌握C语言的一大障碍,“指针”作为C语言的核心内容,如果不掌握指针的相关知识,就不能说是学会了C语言。

本文将通过文字描述+代码解析+图例展示的方式,详细解释C语言指针的含义,以期拨开指针之迷雾、得见C语言之精髓。

首先,“指针”是C语言定义的一种特殊的数据类型,众所周知,任何数据类型都要占用一定的内存空间,比如'char'类型占用一个字节内存、'short'占用2个字节内存等。指针作为一种数据类型,也占用一定的内存空间:32位机器上占用4字节,64位机器上占用8字节(不讨论CPU、操作系统、编译器位数不同的情况~~)。

那么,指针的“特殊”又是指什么呢?

我们知道,当我们定义一个'int'类型的变量时,可以给这个变量赋值不同的数值,当使用这个变量时,直接使用变量名即可。

但是,对于指针的操作,则必须通过两个特殊的运算符:‘&’—取地址运算符和‘*’—间接寻址运算符。

这也就是指针特殊的地方,指针本身占用的那块内存里面,存放的是另外一块内存空间的地址,我们不能直接使用指针的内容。

当给指针赋值的时候,需要使用‘&’运算符获取另外一个变量的内存地址——这也正说明了指针占用的内存空间的大小是和机器的位数(内存地址长度)相关的。

当通过指针访问它所指向那块内存的内容时,需要使用‘*’运算符间接获取另外一块内存空间中的内容。

而这个时候,就需要说到指针所指向的那块内存(另外一个变量)的数据类型了,也就是我们常说的“指针类型”,这个决定了我们通过'*'运算符所能够获取的内容大小。

也就是说,通过‘*’运算符操作一个指针变量时,编译器所能读取的内存大小、以及如何解析这块内存的内容。

有了上面的文字描述之后,我们再通过一段代码,详细解析一下指针变量、指针指向的变量的内容。

#include <stdio.h>

int main(void) {                                                                                                                                             
    printf("--------------------------------------------------------\n");
    
    unsigned char uc[4] = {0x12, 0x34, 0x56, 0x78};
    int index = 0;
    for (; index < 4; index++) {
        printf("uc[%d] = %#x, &uc[%d] = %p\n", index, uc[index], index, &(uc[index]));
    }   
    printf("&index = %p\n", &index);
    
    printf("--------------------------------------------------------\n");
    
    unsigned char *puc = (unsigned char *)(&uc);
    unsigned short *pus = (unsigned short *)(&uc);
    
    printf("*puc = %#x,   puc = %p, &puc = %p\n", *puc, puc, &puc);
    printf("*pus = %#x, pus = %p, &pus = %p\n", *pus, pus, &pus);
    printf("*(puc + 1) = %#x,   (puc + 1) = %p\n", *(puc + 1), (puc + 1));
    printf("*(pus + 1) = %#x, (pus + 1) = %p\n", *(pus + 1), (pus + 1));
    
    printf("--------------------------------------------------------\n");
    
    return 0;
}  

上面代码的输出如下(每次执行后的内存地址会有变化):

从上面的输出结果可以看出:

  1. puc和pus的内容即uc[0]的地址;
  2. puc和pus本身各自占用一块单独的内存空间;
  3. 通过‘*’运算符获取的puc和pus的内容,取决于puc和pus的“指针类型”;
  4. 对于指针加/减操作的步长,取决于”指针类型”。

此外,理解指针还有非常重要的一点,就是程序员的脑海中要对指针涉及的内存布局有一定的想象,从上面的输出结果其实可以推导出一个简单的内存布局如下图所示:

进而,根据上面‘*pus’的输出可以看出我使用的机器是小端的,再加上我的64位机器的指针占用8字节内存,可以进一步推导出如下的详细内存布局图:

程序员在脑海中有了指针相关的内存布局图,再进一步理解那些更复杂一些的指针概念就不难了,比如:“指针的指针”、“指针数组”、“函数指针”~~

以上就是我对指针哪些事儿的理解,欢迎讨论、指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值