人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
立即订阅
953 人已学习
课程目录
已更新 15 讲 / 共 32 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 别闹了,学编程 ≠ 学语言
免费
语言基础篇 (13讲)
01 | 学习编程,我到底该选择哪门语言?
02 | 第一个程序:教你输出彩色的文字
03 | 判断与循环:给你的程序加上处理逻辑
04 | 随机函数:随机实验真的可以算 π 值嘛?
05 | 数组:一秒钟,定义 1000 个变量
06 | 字符串:彻底被你忽略的 printf 的高级用法
做好闭环(一):不看答案可能就白学了
07 | 指针系列(一):记住,指针变量也是变量
08 | 指针系列(二):记住,指针变量也是变量
09 | 函数:自己动手实现低配版 scanf 函数
10 | 预处理命令(上):必须掌握的“黑魔法”,让编译器帮你写代码
11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码
做好闭环(二):函数是压缩的数组,数组是展开的函数
测试篇 (1讲)
期中测试 | 给语言基础篇交一份满分答卷,去迎接新的挑战!
人人都能学会的编程入门课
登录|注册

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

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

任务介绍

这次的任务,是需要我们结合两次学习(本节内容和下一节内容)才能完成,到底是什么呢?你不要有畏惧心理,其实这个任务很简单,假设有如下结构体数组,请看如下代码:
struct Data {
int x, y;
} a[2];
请用尽可能多的形式,替换下面代码中 &a[1].x 的部分,使得代码效果不变:
struct Data *p = a;
printf("%p", &a[1].x);
你会看到,如上代码中,其实就是输出 a[1].x 的地址值。
到了这里,你可能对结构体还不熟悉,并且,你可能对于这个任务应该如何完成还是一头雾水,没关系,暂时忘了这个任务,我们先来讲讲可以解决任务的一些基础知识,再回来看这个任务。
进行下面的学习之前,我还是要强调一下那句话,这句话是我们这两次学习的重点,也是帮助你学习指针的利器,叫做“指针变量也是变量”。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • 徐洲更
    看完本文后还可以看下「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
    1
    3
  • 王建
    想到的方法
    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
    2
  • 信念
    #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
    1
  • 一步
    声明指针变量的时候 int *p = &a , 的执行顺序顺序为&a取出a的地址,然后把地址=赋给变量p,最后用*取出变量p的对应的值。这能说明运算符号的优先级为: & > = > *?

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

    2020-01-21
收起评论
4
返回
顶部