【C语言】数据类型和变量

ASCII 转义写法

  1. \141 八进制 141 → 十进制 97 → ASCII 'a'
    \x30 十六进制 30 → 十进制 48 → ASCII '0'
复制代码
   printf("%c\n", '\141');  //8进制,转十进制 为97 对应a
   printf("%c\n", '\x30'); // 16进制,转十进制,为48 对应0

转义字符( \ )

  1. 转义小总结
    1)\t → Tab 制表
    2)\b → 退格
    3)\xxx → 八进制转义,\后跟数字
    4)\\ → 打印出一个普通反斜杠\
    5)strlen统计\0之前有效字符数量,不包含结束符\0
  2. 例子求字符串的长度
    求该字符串的长度 c:\test\bit\113.c
    a) \t 是转义字符 算一个字符
    b) \b 是转义字符 算一个字符
    c) \113 是转义字符 算一个字符
  3. \0是字符串的结束标志,strlen在求字符串长度的时候,统计的是\0之前字符的个数
复制代码
   //求一个字符串的长度
   int len = strlen("abc");   //string len
   printf("%d\n", len);
   // \0 是字符串的结束标志,strlen在统计字符串长度的时候,统计的是\0 之前的字符串个数

   int len1 = strlen("c:\test\bit\113.c");
   printf("%d\n", len1);

布尔类型

  1. 0表示假,1表示真
复制代码
   bool flag = false;
   //0 表示假,1表示真
   if (flag)
   {
   	printf("haha\n");
   }
   else
   {
   	printf("hehe\n");
   }

sizeof 操作符

  1. sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof的操作符数的类型⻓度的,单位是字节。

  2. sizeof 的计算结果是 size_t 类型的。

  3. sizeof 操作符的操作数可以是类型,也可是变量或者表达式。

  4. sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。

  5. size_t,用来统一表示 sizeof 的返回值类型

  6. sizeof里面的表达式不会执行

    复制代码
        short s = 2;
    	int b = 10;
    	printf("%d\n", sizeof(s = b+1));
    	printf("s = %d\n", s);

    sizeof 是求数据类型的大小,不会因数据的变化,而改变数据类型的大小

signed 和 unsigned

  1. signed 关键字,表⽰⼀个类型带有正负号,包含负值;
  2. unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。
  3. %d:有符号 int,正常打印正负、0
  4. %u:无符号 unsigned int,只打印非负数字
复制代码
       //有符号数 用%d 可以打印正负数,以及0
   	signed int a = 10;
   	printf("%d\n", a);
   	a = -20;
   	printf("%d\n", a);
   	a = 0;
   	printf("%d\n", a);

       // 无符号数 只能打印大于0的数
       unsigned int b = 12;
       printf("%u\n", b);

全局变量和局部变量

  1. 全局变量和局部变量在内存中的存储地方

    1)局部变量是放在内存的栈区
    2)全局变量是放在内存的静态区

    3)堆区是⽤来动态内存管理的

  2. 变量初始化核心知识点

    1)局部变量

    a)位置:栈区

    b)自动初始化:不会自动初始化为 0

    c) 如果只声明不赋值,内存里是栈遗留的随机垃圾值

    d)直接使用属于未定义行为,结果随机,每次运行可能不一样
    e)局部变量定义时手动初始化:int a = 0;
    2)static 修饰的局部变量
    a)位置:静态区(全局数据区)

    b)生命周期:程序整个运行周期,函数结束不销毁

    c) 自动初始化:不赋值默认就是 0,只初始化一次

    复制代码
    void test(){
        static int a;
        printf("%d",a); //输出0
    }

    3)全局变量
    a)位置:静态区

    b)自动初始化:不写 = 0,默认自动初始化为 0

    c) 生命周期:整个程序

    复制代码
    int g_num; //全局,默认0
    int main(){
        printf("%d",g_num); //打印0
        return 0;
    }
  3. 总结

  4. 面试高频考点
    a)只有静态区的变量才会自动清零,栈区不会
    b)static 改变局部变量的存储位置、生命周期,不改变作用域(只能本函数内使用)。
    c) 局部变量要手动初始化

全局变量和局部变量(补充)

代码块可以访问外部全局变量

复制代码
   int a = 100;

   int main()
   {
   	printf("%d\n", a);
   	{
   		printf("%d\n", a);
   	}
   	return 0;
   }
  1. 当代码块内部没有定义变量 a时,编译器会向外层作用域查找,最终找到全局变量 a,其值为 100。

  2. { }表示一个代码块(也称为复合语句)

变量屏蔽 / 就近原则

复制代码
   //变量屏蔽
   int a = 100;

   int main()
   {
   	{
   		//全局变量和局部变量同名时,局部变量优先
   		int a = 10;
   		printf("%d\n", a);
   	}
   	return 0;
   }
  1. 局部变量和全局变量同名的时候,局部变量优先使用
  2. 大括号{ }内部定义了局部变量int a = 10
  3. 在这个大括号范围内,局部 a 优先,把全局的 a 屏蔽掉
相关推荐
T1mzhou10 小时前
ARM64 Linux 6.10内核启动流程7-ioremap和readl writel
linux·服务器·c语言
未来之窗软件服务15 小时前
计算机二级[英文]-C 字符串移动—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
是隼人20 小时前
buuctf-pwn bypwn(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
T1mzhou21 小时前
ARM64 Linux 6.10内核启动流程6-psci.c和ATF/U-Boot 的电源接口
linux·服务器·c语言
是隼人21 小时前
buuctf-pwn PWN2(整数溢出)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
LuminousCPP1 天前
数据结构 - 排序(二):快速排序从错误初版到优化版|双指针划分 + 三数取中 + 小区间插入优化
c语言·数据结构·笔记·算法·排序算法
竞赛考级题库1 天前
202606 青少年等级考试C/C++真题一级 建议答题时长:60min
java·c语言·c++
迷茫、Peanut1 天前
C语言混合链接
c语言
wdfk_prog1 天前
RT-Thread Kconfig 配置明明是 y,为什么 rtconfig.h 就是不生成?一次 `_PATH` 后缀踩坑复盘
c语言
是隼人1 天前
buuctf-pwn jarvisoj_level5(64位ret2libc)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门