• [C]语法, 知识点总结(一. 进制, 格式化输入/出, 指针)


    进制

    概念: n进制, 最大的数是n-1, 逢n进1位.

    数据类型

    概念:

    其实就是占的位数不同, 转换到计算机当中都是0和1.

    常用:
    类型名 占字节数 描述
    char 1字节=8个二进制位 字符类型, 也是整型存入本地(参照ASCII码表)
    short 2字节=16个二进制位 短整型类型, 2的16次幂表示的数
    int 4字节 整型
    long 4字节(32位),8字节(64) 长整型
    float 4字节 浮点型(有效数字6-7位)
    double 8字节 双精度浮点型(有效数字15-16位)
    long double 16字节 长双精度浮点型(有效数字18-19位)
    注意:

    记住一句话, 你不需要管怎么存, 只需要知道如何取, 例: 查看一个char类型, 你可以用%d打印

    格式化输入

    原理:

    在控制台输入的内容放到缓冲区中, 然后设置条件(scanf占位符), 按Enter键, 根据占位符个数赋值到对应的地址中
    例:scanf("%c %c")

    代码格式:

    scanf("占位符, 占位符", &类型, %类型);
    例子:
    char ch;
    int num;
    scanf("%c, %d", &ch, &num);

    注意:
    • 在控制台输入的时候, 必须遵循scanf里的格式, 该有逗号和空格必须得输入
    • 占位符可有多个, 但是数量必须和后面类型对应上
    • 最好占位符中不要添加/n, 会过滤掉你在控制台输入的回车
    • 不要使用小键盘的Enter, 而是要用大键盘的Enter
    补充:

    getchar() 可以从控制台接受一个字符
    例如: char a = getchar()

    格式化输出

    printf("占位符", 变量);
    例1:
    int a = 10;
    printf("%d", a);
    例2:
    printf("%d ", 20);

    常用占位符
    占位符 含义(格式化输出)
    %c 字符
    %s 字符串
    %d, %i 整数
    %o 八进制数
    %x, %X 十六进制数
    %u 无符号十进制
    %f 浮点型
    %fL, %Lf 长浮点型
    %.2f 保留小数点后2位
    %p 指针
    %% %号

    常见问题

    例1.

    int a = 1;
    5 > 3 || a++; 问: a最后的值是多少?

    分析: || 逻辑或, 左边5 > 3 已经为真, 那么右面无论是真, 是假, 整个表达式都是真, 所以逻辑或进行了优化, 如果左边为真, 右面就不会运算, 所以a还是1

    例2.

    int a = 1;
    int b = 1;
    a *= b + 3; 问: a最后的值是多少?

    分析: 复合运算, 默认打开之后是a = a * b + 3, 但是呢复合运算, 会进行优化, 也就是a = a * (b + 3), 所以a是4

    例3.

    int a = 2, b = 3;
    (a++)+b; 和a+++b; 问: 这2个表达式最后的值是多少?

    分析: 这2个表达式其实一样, a++必须在表达式结束后, 自己的值才会进行自增, 也就是a++ 然后还没有结束, 先用a的值, 然后+b 所以结果等于5, 然后a的值才等于3

    指针

    我们先来看下, 内存大概分为这几块
    内容空间.png

    定义:

    int b = 10;
    int *p = &b; // 先来说说很多人纠结的一个问题: p到底是什么类型的, 其实它是一个指向整型数字的地址的指针. 这个我们来看图. (ps: 10的地址在常量区是0xa, 用%p可以打印一下)
    内存分析.png
    分析一下上面这个图:
    10的地址是0xa, 然后int b = 10;
    现在b这个变量里存的就是10;
    然而, b自己是有地址的
    而现在 int **p = &b(&代表获取b的地址);
    p也是一个变量, 是指向整型数字的地址的指针, 那么p保存的是b的地址;
    然后作为一个保存地址的p变量其实也有自己的地址;

    使用:

    现在我们想要利用p来访问10怎么办, 下面这样.
    int num = *p;// 星号单独出现, 叫做间接访问修饰符 (访问这个p里保存的地址所保存的内容)

    注意1

    int *a = NULL, b = 3; (这个时候b是整型)
    扩展: nil(指针为空) Nil(一个类指针为空) NULL(基本数据类型为空)

    语法糖(一般用于访问数组)

    int a[5] = {1, 2, 3, 4, 5};
    先来看下数组的分配空间:
    数组空间分配.png
    说明: 其实就是a虽然是数组的名字, 但是它存的是数组中第一个元素的地址(也就是a本身就是个指针)
    用语法糖访问数组中的2应该怎么办?
    a[1]; // 这里[]里填写元素所在的下角标(从0开始数), 那么指针发生了移动, 现在指向高位移动4个字节

    (why: 因为元素类型是int型(占4字节))所以每次移动4字节就到元素2
    (a[1] 原型是 *(a + 1)) 其实还可以这么写1[a]

  • 相关阅读:
    2008年总结
    感触
    24105
    事情总喜欢蜂拥而至
    最后的稻草
    什么叫服务
    sigh,终于submit了
    在工作和生活的狭缝中生存着
    不应该,不应该
    ren 人 认 忍 韧 仁
  • 原文地址:https://www.cnblogs.com/lidongxu/p/5641786.html
Copyright © 2020-2023  润新知