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

    文章

    7604

    浏览量

    136770
  • 指针
    +关注

    关注

    1

    文章

    480

    浏览量

    70559
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28365

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

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

收藏 人收藏

    评论

    相关推荐

    函数指针指针函数的概念

    不少朋友会混淆“函数指针”和“指针函数”这两个概念,本文详细介绍一下。
    发表于 03-09 10:49 1211次阅读

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

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

    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 3625次阅读

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

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

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

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

    轻松理解C语言指针的实验和详细资料说明

    我并不打算使用过于官方、正统的语言来讲解指针。因为如果我这样做,就失去了做这个教程的意义。如果需要,大家完全可以从各大教材、网站找到对指针正规的解释。但无疑,这种正规、一丝不苟的解释却没法带领大家,尤其是学习C语言的新手,来轻松的领悟
    发表于 04-11 16:08 10次下载
    轻松<b class='flag-5'>理解</b>C语言<b class='flag-5'>指针</b>的实验和详细资料说明

    如何轻松理解C语言指针的详细资料说明

    我并不打算使用过于官方、正统的语言来讲解指针。因为如果我这样做,就失去了做这个教程的意义。如果需要,大家完全可以从各大教材、网站找到对指针正规的解释。但无疑,这种正规、一丝不苟的解释却没法带领大家,尤其是学习C语言的新手,来轻松的领悟
    发表于 05-08 17:48 11次下载
    如何轻松<b class='flag-5'>理解</b>C语言<b class='flag-5'>指针</b>的详细资料说明

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

    理解函数指针、函数指针数组、函数指针数组的指针
    的头像 发表于 06-29 15:38 1.5w次阅读
    <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 1902次阅读

    浅谈指针常量和常量指针

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

    指针是什么

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

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

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

    面试常考+1:函数指针指针函数、数组指针指针数组

    在嵌入式开发领域,函数指针指针函数、数组指针指针数组是一些非常重要但又容易混淆的概念。理解它们的特性和应用场景,对于提升嵌入式程序的效率
    的头像 发表于 08-10 08:11 850次阅读
    面试常考+1:函数<b class='flag-5'>指针</b>与<b class='flag-5'>指针</b>函数、数组<b class='flag-5'>指针</b>与<b class='flag-5'>指针</b>数组