五大板块(2)—— 指针

本文深入探讨C语言中的指针,包括地址概念、指针变量、指针类型与偏移量、函数指针、结构体指针、野指针及其管理,以及指针在内存管理、函数调用和数据共享中的作用。通过实例解析,帮助读者理解并掌握指针的使用技巧。
摘要由CSDN通过智能技术生成

师承陈立臣

基于课程应用的c语言基础回顾:五大板块 —— 数组,指针,结构体,链表,字符串

本文为学习笔记,整合课程内容及文章如下:

为什么要使用指针 板块:
参考:原文链接
作者:Cloudkip

指针,你说他难吧,其实都是在学校学的时候给劝退了,其实很简单,而且学会了之后老是想用,也很好用,以后看到指针就不会有心理障碍啦。

一、地址的引入

概念

地址是一个十六进制表示的整数,用来映射一块空间,是系统用来查找数据位置的依据。地址标识了存储单元空间,而字节就是最小的存储单位。

按字节的编址方式:每一个字节都有一个唯一的地址。例如:一个int型的变量是4个字节,就会对应4个地址,我们只需要取到这个变量的首地址就能得到完整的int型数据。

地址长啥样?

用一个例子感受变量存放的地址:

#include <stdio.h>

int main()
{
   
        int a=10;
        int b=11;
        int* p=&a;
        int* p2=&b;

        printf("a的地址是:%p\n",p);
        printf("b的地址是:%p\n",p2);

        return 0;
}

结果:可以发现两者地址相差4个字节,说明int型变量用4个字节的空间存放

a的地址是:0x7ea5d1dc
b的地址是:0x7ea5d1d8

大概可以表示为:

在这里插入图片描述

二、指针变量的引入

什么是指针?从根本上看,指针是一个值为内存地址的变量。

正如char型变量存放字符,int型变量存放整型数一样,指针变量存放的是地址,没有什么难理解的。

给指针赋值就是让其指向一个地址。

三、指针分类型与指针偏移量

用sizeof发现linux下所有指针类型的大小均为8字节。

平台:树莓派

整型指针,字符指针

#include <stdio.h>

int main()
{
   
        int a = 5;
        char b = 'A';

        int *pa = &a;//存放整型数的指针叫整型指针
        char *pb = &b;//而这叫字符型指针

        //printf("int型指针 pa 的地址是%p,指针偏移(++pa)的地址是:%p\n",pa,++pa);
        //printf("char型指针 pb 的地址是%p,指针偏移(++pb)的地址是:%p\n",pb,++pb);

        printf("int 型指针pa的地址是%p\n",pa);
        printf("int 型指针偏移(++pa)后的地址是:%p\n\n",++pa);

        printf("char 型指针pb的地址是%p\n",pb);
        printf("char 型指针偏移(++pb)后的地址是:%p\n",++pb);

        return 0;

}

结果:可以看到指针类型不同,其每次偏移的地址量也不同。

pi@raspberrypi:~/Desktop $ ./a.out  
int 型指针pa的地址是0x7ead81ec
int 型指针偏移(++pa)后的地址是:0x7ead81f0

char 型指针pb的地址是0x7ead81eb
char 型指针偏移(++pb)后的地址是:0x7ead81ec

不知道你会不会思考,为什么我不使用代码中被注释的两条语句,简短明了,而要使用4条printf。
你尽管试试,打印出来的pa和++pa是一样的,好似是地址没有偏移,这其实关系到了printf的出栈入栈问题,放在六、其他小知识点:printf 里的 a++,++a,真的有鬼!! 中详细展开。

函数指针(重点)

顾名思义,指向函数地址的指针。

无参无返的函数指针

这是函数指针最简单的一种形式

#include <stdio.h>

void print()//要被指向的函数
{
   
        printf("hello world\n");
}

int main()
{
   
        void (*pprint)() = NULL;//定义函数指针
        pprint = print;         //函数指针赋值:指向函数的首地址(就是函数名)
                                              //如同数组的首地址,是数组名
        pprint();        //调用方法1
        (*pprint)();     //调用方法2
        
        printf("函数指针pprint的地址是%p\n",pprint);
        printf("函数指针偏移(++pprint)后的地址是:%p\n",++pprint);

        return 0;
}

结果:

hello world
hello world
函数指针pprint的地址是0x1046c
函数指针偏移(++pprint)后的地址是:0x1046d

有参有返的函数指针

稍微上升点难度

#include <stdio.h>

int sum(int a,int b)//要被指向的函数
{
   
        int c = 0;
        c = a+b;
        return c;
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值