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

08 | 指针系列(二):记住,指针变量也是变量

胡光 2020-01-23
你好,我是胡光,咱们又见面了,上节课中,我们介绍了结构体相关的基础知识,也介绍了指针变量,并且教给你了最重要的一句话“指针变量也是变量”。这句话的意思在于告诉你,所有你对变量的理解,都可以放到指针变量上,例如:变量有类型,变量有大小,变量里面的值支持某些操作等等。今天呢,我们就来详细地聊一下指针变量。

任务回顾

在正式开始之前,我们先来回顾一下上节课的任务内容:
上节课我们说,如果给我们如下 Data 结构体类型,这个类型中有两个整型数据字段 x,y:
struct Data {
int x, y;
} a[2];
那么请用尽可能多得形式,替换下面代码中 &a[1].x 的部分,使得代码效果不变:
struct Data *p = a;
printf("%p", &a[1].x);
你会看到,如上代码中,就是输出 a[1].x 的地址值。
通过上节的学习,你现在已经掌握了关于结构体的相关知识,也初步地接触了“指针变量也是变量”的这个概念,今天就让我们再深入了解指针变量吧。

必知必会,查缺补漏

1. 深入理解:指针变量的类型

还记得我们是如何定义 p 变量的么?代码语句是:
int *p
之前我们介绍了,语句中的 * 代表 p 变量是一个指针变量,而 int 的作用是什么呢?只是用来说明 p 是一个指向整型存储区的指针变量么?其实 int 更大的作用,就是用来解决我们上面提到的那个问题,根据 p 变量中的内容,我们可以找到一个存储区的首地址,然后再根据 p 的类型,就可以确定要取几个字节中的内容了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • 徐洲更
    同样也有@大牛凯一样疑惑,不过不只是针对指针,而是所有数据类型。C语言是如何存放类型信息呢?对于`int a`而言,使用`a="123"`将字符串赋值给整型是会出问题的。这种类型错误的底层原理是啥呢?是不是C语言会划定一些区域,用来存放不同类型的变量呢?

    作者回复: 类型信息会被转换成相关的汇编代码。这个当中涉及到两件事情:一个是类型检查,这个是在编译阶段就做完了,另一个就是具体的程序运行,而运行阶段就已经没有了类型信息。也就是说,你所谓的出错,是在编译阶段报的错误。这个问题,你可以往后看,看到预处理命令一节的时候,可能就会认识的更清晰了。

    2020-01-23
    1
    2
  • 大牛凯
    老师好,请教一个问题,所有指针如果都是无差别存储地址的话,那拿到一个指针如何判断它的类型呢?整数型和字符型指针中,“整数”和“字符”这两个类型是存放在哪的呢?

    作者回复: 这个信息已经转换成了相关的汇编代码,你想想,指针的类型是不是只有在加减运算和取值操作的时候有用?那么转换成汇编的时候,只需要对这两个操作,做针对性的转换即可。

    2020-01-23
    1
    2
  • 信念
    #include<stdio.h>

    int main(){
    int a, *p = &a;
    char*q = &a;
    printf("%p %p", p, q);
    printf("%p %p", p + 1, q + 1);
      return 0;
    }
    请问一下为什么上述程序编译不了呀?我用了gcc,但是报错了,麻烦老师看一下。

    作者回复: 报错信息发我一下

    2020-02-08
    1
  • 潮汐
    更清楚理解关于c语言中的数组,指针,内存空间(字节,存贮单元)的关系,还有他们的一些运算的原理。老师的讲解思路清晰连贯,跟下来学到非常多,点赞!

    作者回复: d(^_^o)

    2020-01-31
  • Geek_Andy_Lee00
    参照老师的参考**答案和等价**关系,我能想到的替换类型还有:
    1)将参考**答案中的a替换为p;
    2)&(*(p+1).x);
    3)&(a[0].x)+2或者&(a[1].y)-1;
    4)&(*p.y)+1
    对吗老师?

    作者回复: 第四个有错误,直接引用运算符 . 的优先级要高于 取值运算符 *,也就是说先算右边的 p.y,这个是不对的。更多的关于运算符优先级的内容,你可以上网自行搜索。

    2020-01-24
收起评论
5
返回
顶部