人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
19410 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
开篇词 (1讲)
人人都能学会的编程入门课
15
15
1.0x
00:00/00:00
登录|注册

07 | 指针系列(一):记住,指针变量也是变量

你好,我是胡光,上节课中,我们对两个概念做了区分,就是“值”和“变量”。你也看到了,当我们将 printf 函数中的第一个参数,抽象成变量以后,整个程序的功能会变得异常的灵活。
今天我们将要学习的 “指针”呢,也是一种变量,这是一种存储地址的变量。这种变量,可谓是所有变量的终极形态,掌握了指针,也就掌握了程序设计中“变量”的全部知识。今天,我们只会围绕着一句话进行学习,一定要记住,那就是 “指针变量也是变量”。

任务介绍

这次的任务,是需要我们结合两次学习(本节内容和下一节内容)才能完成,到底是什么呢?你不要有畏惧心理,其实这个任务很简单,假设有如下结构体数组,请看如下代码:
struct Data {
int x, y;
} a[2];
请用尽可能多的形式,替换下面代码中 &a[1].x 的部分,使得代码效果不变:
struct Data *p = a;
printf("%p", &a[1].x);
你会看到,如上代码中,其实就是输出 a[1].x 的地址值。
到了这里,你可能对结构体还不熟悉,并且,你可能对于这个任务应该如何完成还是一头雾水,没关系,暂时忘了这个任务,我们先来讲讲可以解决任务的一些基础知识,再回来看这个任务。
进行下面的学习之前,我还是要强调一下那句话,这句话是我们这两次学习的重点,也是帮助你学习指针的利器,叫做“指针变量也是变量”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了指针和结构体的基础知识。首先,指针是一种存储地址的变量,是程序设计中“变量”的终极形态。文章强调了“指针变量也是变量”的重要性,并通过结构体的介绍,讲解了如何定义新的数据类型,以及如何使用结构体来表示坐标类型的数据。此外,文章还提到了结构体变量的大小计算规则,以及指针变量的定义和使用方法。作者强调了结构体类型所占存储空间大小与其内部字段的组成和顺序排布有关,同时指针变量也是一种存储地址信息的变量。这篇文章对于初学者来说是一份很好的技术指南,能够帮助他们快速了解指针和结构体的基础知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《人人都能学会的编程入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 王建
    想到的方法 printf("%p\n", &a[1].x); printf("%p\n", a+1); printf("%p\n", (int*)a+2); printf("%p\n", (double*)a+1); printf("%p\n", (char*)a+8);

    作者回复: 都对!d(^_^o)

    2020-01-21
    5
  • 徐洲更
    看完本文后还可以看下「C和指针」的第6章和第10章,可以加深对指针和结构体的理解。 关于本次题目,解题步骤如下 1. a 是一个数组,每个元素都是一个结构 2. p是一个指向结构体的指针,存放了数组a的首地址 3. 对于&a[1].x,运算符优先级为[] > , > &, 即下标引用大于访问结构成员大于求地址 4. 根据第3条里的运算规则,运算会得到是数组a中第二个结构x的地址 综上,对应答案和解释如下 - p+1: p是a[0]的地址,p+1是a[1]的地址,同时a[1]的第一个元素是x,p+1也就是a[1].x的地址 - &(*(p+1)).x: 先用*取值得到a[1],然后获取地址 - &(p+1)->x: *+.的操作可以用 ->代替 - &p[1]: 可以把p当作a来操作 - &p[1].x 代码我放在GitHub上: https://github.com/xuzhougeng/learn-c-in-JKSJ/blob/master/jksj-07-pointer-1-c 这里再提一个问题,指针的指针一般在什么情况下用

    作者回复: 思考的很不错。要说指针的指针应用场景,一般就是用来替代二维数组的。可其本质和二维数组还有所不同。此外,你可以把指向指针类型的指针,这句话,看成是,指向某个类型的指针,而这某个类型,就是指针类型,所以你这个问题,本质上也是在问指针有啥用。从这个角度,自行思考一下,就明白了。

    2020-01-22
    3
    4
  • 1043
    这个指针有点像一个打开一个文件的“快捷方式”。

    作者回复: 嗯,这个比喻比较形象

    2020-04-04
    3
  • 1043
    指针变量就是指针本身吗?指针变量可以存储整形变量,如果没有指针这个整形变量会丢失吗?或者说没有指针这个整形变量会变的很不稳定或者是非常复杂的状态吗?

    作者回复: 指针变量存储整形变量的地址。指针变量就像快递上面那个便签,没有那个便签,你家房子会丢不?

    2020-04-04
    1
  • 刘伟
    这一节指针的知识确实比较困难,个人理解是指针获得了某个值的地址信息。

    作者回复: 嗯,指针存储着某个变量的地址。^_^

    2020-04-03
    1
  • 小温暖。
    以前学C的时候经常栽在指针上

    作者回复: 看懂等价表示形式即可^_^

    2020-03-22
    1
  • 罗耀龙@坐忘
    茶艺师学编程 说到指针,存在在地址上挪位指针的操作吗?

    作者回复: 地址只是指针变量中存储的值,指针变量中改一个值,就是指向了其他地址。

    2020-05-19
  • 信念
    #include <stdio.h> int main(){ struct point p; sizeof(p); sizeof(struct point); printf("%zu",sizeof); return 0; } 请问一下怎么用printf输出sizeof的值呀?查了资料还是不太会

    作者回复: printf("%d",sizeof(struct point));

    2020-02-08
    3
  • 声明指针变量的时候 int *p = &a , 的执行顺序顺序为&a取出a的地址,然后把地址=赋给变量p,最后用*取出变量p的对应的值。这能说明运算符号的优先级为: & > = > *?

    作者回复: 在定义指针变量p的时候,*只是用来说明p是一个指针变量,而不是取值运算,这一点要注意。另外,运算符的优先顺序,搜索C语言运算符优先级表。要学会看那个表。

    2020-01-21
  • 韩非
    好家伙,这么多年,终于懂了指针了。。。
    2021-08-14
    1
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部