0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么理解指针的指针?

学益得智能硬件 来源:学益得智能硬件 2024-02-23 16:46 次阅读

怎么理解指针的指针?其实这个概念并不难,只是把它放到实际应用中,容易造成困扰。

指针的指针还得先从指针讲起。

先有一个变量,假设它是整型,在系统中占 4 个字节。

int a;

内存是以字节为单位,每个字节都有一个地址,所以变量 a 占了4个地址。

wKgaomXYW6eAF520AAhEpgtfiMA992.jpg

C语言中,描述变量 a 的地址,一般取最前面的这个字节,所以 a 的地址是 0x100。

为了方便计算,很多时候我们想把 0x100 保存下来,于是又需要一个变量,这个变量就是指针变量。指针的大小跟环境有关系,这里假设占 4 个字节。用代码来表示,可以写成:

int *p = &a;

我们也经常说,指针 p 指向变量 a。

wKgZomXYW6eAd6EAAAfU7kUaPSs671.jpg

既然 p 在内存中占了 4 个字节,那他肯定也有个地址,假设这个地址是 0x1000,如果想把 0x1000 保存下来,那就需要指针的指针。

指针的指针也属于指针,所以在内存中也占 4 个字节。

如果用代码来表示,可以写成:

int **q = &p;

q是个指针,指向变量 p,因为 p 本身也是个指针,所以就把 q 称作指针的指针。

虽然 q 和 p 都是指针,但是也不能随便赋值,比如能不能写成:

q = &a;

q是指针,&a是地址,地址赋值给指针,简直完美。

这个代码完全行不通,因为 q 是 int ** 类型,它只能指向 int *类型的变量,比如 p 就是 int * 类型的变量,而 a 是 int 类型的变量。

关于指针的指针,有个极其经典的笔试题,如果你刷过题,那你一定会遇到。



这个题目问题就出在实参和形参是两块不同的内存,malloc申请的内存,地址记在了形参中,对实参没有任何的影响,所以在主函数中,实参一直是空,把字符串拷贝进去,就会出现段错误。

void init_memory(char **s)
{
    *s = malloc(128);     
}


int main()
{
    char *str = NULL;
    
    init_memory(&str);
    
    strcpy(str, "helloworld");
            
    return 0;
}
修改的方法就是传指针 str 的地址,形参改成指针的指针,于是就出现了 s 指向 str,*s 就是 str,执行init函数,str从NULL变成了一个合法的地址,程序就能顺利运行。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128589
  • 指针
    +关注

    关注

    1

    文章

    473

    浏览量

    70361
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28112

原文标题:怎么理解指针的指针?

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    指针的用法总结,指针用法大全

    让你不再害怕指针前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个
    发表于 10-14 17:51 87次下载

    C语言入门教程-指针

    指针 在C语言中,指针被广泛使用。所以要想完整地掌握C语言,您需要对指针有很好的了解,并能够运用自如。这一节和随后几节,将帮助您建立起对指针的完整
    发表于 07-29 11:30 590次阅读

    C和指针习题答案配C和指针

    C和指针习题答案配C和指针
    发表于 09-07 14:29 6次下载
    C和<b class='flag-5'>指针</b>习题答案配C和<b class='flag-5'>指针</b>

    c语言函数指针定义,指针函数和函数指针的区别

     往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面就由小编详细为大家介绍C语言中函数指针指针函数和函数指针之间的区别。
    发表于 11-16 15:18 3406次阅读

    深入理解C指针(C/C++程序员进阶必备,透彻理解指针与内存管理)pdf

    深入理解C指针
    发表于 03-21 09:42 116次下载

    为什么使用指针?C++中的“指针

    为什么使用指针?因为在操作大型数据和类时,指针可以通过内存地址直接访问数据,可避免在程序中复制大量的代码,因此指针的效率最高。一般来说,指针会有3大用途
    的头像 发表于 10-04 10:33 4783次阅读

    C语言中的“二级指针”该如何理解

    在讨论C语言指针时,我一直在强调“将指针看作普通数据类型”,要是读者能够记住这一点,在看到二级指针时,将其与其他普通数据类型对比分析,会发现其实二级指针也没什么难的。
    发表于 07-31 16:58 1.2w次阅读
    C语言中的“二级<b class='flag-5'>指针</b>”该如何<b class='flag-5'>理解</b>

    理解函数指针、函数指针数组、函数指针数组的指针

    理解函数指针、函数指针数组、函数指针数组的指针
    的头像 发表于 06-29 15:38 1.4w次阅读
    <b class='flag-5'>理解</b>函数<b class='flag-5'>指针</b>、函数<b class='flag-5'>指针</b>数组、函数<b class='flag-5'>指针</b>数组的<b class='flag-5'>指针</b>

    C语言指针理解使用

    C语言指针理解使用指针变量的声明给普通变量的赋值对比给指针变量的赋值代*的指针的使用说明指针
    发表于 01-13 13:42 3次下载
    C语言<b class='flag-5'>指针</b>的<b class='flag-5'>理解</b>使用

    二级指针和多级指针的定义形式

    指针变量作为一个变量也有自己的存储地址,而指向指针变量的存储地址就被称为指针指针,即二级指针
    的头像 发表于 10-18 16:38 1451次阅读

    C语言中的悬空指针和野指针是什么意思?

    提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词:“悬空指针”和“野指针”。
    的头像 发表于 02-09 17:20 787次阅读

    浅谈指针常量和常量指针

    这节课我们来讲一讲指针常量和常量指针
    的头像 发表于 02-21 09:27 770次阅读

    C语言中一级指针、二级指针和三级指针

    一级指针的用法其实是取数据的地址,以此类推,二级指针就是取一级指针的地址,也可以表示一级指针的指向的内容。
    发表于 05-19 17:30 950次阅读
    C语言中一级<b class='flag-5'>指针</b>、二级<b class='flag-5'>指针</b>和三级<b class='flag-5'>指针</b>

    指针是什么

    指针是什么? 1.1 浅谈指针 理解指针的 两个要点: 指针是内存中一个最小单元的编号,也就是地址; 平时口语中说的
    的头像 发表于 11-24 15:50 1274次阅读
    <b class='flag-5'>指针</b>是什么

    函数指针指针函数是不是一个东西?

    函数指针的本质是指针,就跟整型指针、字符指针一样,函数指针指向的是一个函数。
    的头像 发表于 01-03 16:35 260次阅读
    函数<b class='flag-5'>指针</b>和<b class='flag-5'>指针</b>函数是不是一个东西?