c与指针(1-8章节)小知识点记录

  1. 整型包含:字符(8b1字节),短整型(至少16b2字节),整型(根据编译器决定),长整型(至少32b4字节)

  2. 字符类型char本质是最小的整型,只是被编译器解释成字符

  3. 一个程序在32到64之间的可移植性可以通过字符型char在程序中的实际数值区间体现,实际数值区间位于有符号与无符号(unsigned char和char之间)最佳

  4. 对于常量,将其后缀设为L或者U代表着长整型或无符号

  5. 浮点数分为三类—>float,double,long double—>对于这三者的长度并未准确规定,双精度至少和单精度一样长,长双精度至少和双精度一样常

  6. 所有的浮点类型至少能容纳10的次方-37到37范围内任何值

  7. 浮点数在缺省定义的情况下,总是双精度类型,可跟后缀l或者f表示长双精度和单精度

  8. 指针就是变量存储地址的另一种名称

  9. 字符串常量–>一串以NULL结尾的零个或多个字符

  10. 指针的声明,int a—>一个int类型的a变量,此时的a是一个指向整型的指针,再例如char *mes=“HW”;声明了一个指向字符的指针mes,在初始化中将"HW"字符的字符串首地址赋值给了mes,所以上述字符串语句可以分为—>char *mes;mes=“HW”;

  11. typedef的使用,例如 typedef char * ptr,该语句将ptr作为指向字符的指针类型的新名字,此时声明一个指针变量ptr a;a=“HW”

  12. const常量…const int a=0;int const a=0;上述两语句同义

  13. 使用const修饰指针,
    int *ptr;//ptr是一个指向整型的指针
    int const *ptr;//const位于间接访问符号前端,ptr指针数值是可以修改的,但是ptr对应地址内的数据是无法修改的
    int * const ptr;//与上述语句不通,此时的const修饰的ptr这个指向整型的指针,ptr对应地址存储数据是可以修改的,而ptr这个指针是无法修改的
    int const * const ptr;//经过上述两语句的解释,这条指针定义中,无论地址还是地址内数据都是无法修改的

  14. 变量作用域,对于代码块内的变量/数据,其作用区域只限于代码块内;在文件中声明的,但是并未在任何代码块内的,其作用域是整个文件

  15. 链接属性,一共三种external—internal–none;internal属性表示在当前文件内,该变量/函数/…是指向同一实体的,而external属性表示,在整个项目中,所有文件中的该…是指向同一实体的;可使用extern和static修改链接属性

  16. 存储类型—>数据的存储类型决定了数据的生命周期;

  17. 存储类型一共分为:内存/运行堆栈/硬件寄存器;存储类型是取决于声明的位置

  18. 静态变量==>在所有代码块之外声明的变量总是存储在静态内存中—这里的静态内存指的是非堆栈内存,这类变量也称为静态变量,这类变量无法指定其他存储类型,创建于程序运行之前,在程序整个执行期间一直存在

  19. 自动变量==>在代码块内声明的变量存储类型是auto,即运行时堆栈,可以使用auto关键字对变量进行修饰,直至程序执行到代码块位置,自动变量才会被创建,同理当代码块结束,自动变量也会销毁,而且当代码块第二次被执行时,同一自动变量的数值是不会继承上一次运行的结尾数值,即重新初始化;而在代码块中声明的变量,添加上static前缀,即可使得存储类型从auto编程静态变量,在程序执行的整个过程中,该变量是一直存在的,意味着在代码块的第二次被执行时,该变量是继承上一次执行结尾数值.

  20. 寄存器变量,使用register关键字对auto变量进行声明,不同于普通的auto,声明后的寄存器变量是存储在硬件寄存器中的,将使用频率高的变量声明为寄存器变量,程序的效率将会得到提升

  21. 三种存储类型变量的初始化–>

    静态变量在初始化中,可以将可执行程序文件想要初始化的数值放在程序执行时用到变量的位置—啥时候用啥时候初始化,如果并未显式的初始化,静态变量将初始化为0
    auto的初始化开销更大,因为只有当执行到代码块的时候才会创建这个变量,它的存储位置是无法判断的,这也导致auto在初始化时,并未给出缺省初始化数值0—自动变量一定要在声明的时候做初始化

  22. static关键字:
    这个关键字在程序中位置不同会具有不同的意思
    用于函数定义或者代码块外的变量声明前缀,使用来修改标识符的链接属性的,使用static修饰的声明函数只能在源文件中进行访问,但当用于代码块内部中对标识符进行修饰时,是用来修改变量的存储类型的

  23. 边界对齐—例如整型存放的起始位置只能是某些特定的字节,通常是2或4的倍数

  24. 不论何种数据类型,均以整型形式存储,区别在于编译器中,它声明的浮点数还是整型.根据声明的不同,编译器对其解释不同—不能通过一个简单的数值来判断数据是哪种类型

  25. 指针变量就是指向数值存放内存处的地址

  26. 未初始化和非法的指针------对于全局变量和静态变量,会自动给未初始化指针初始化为0,------但如果是代码块中的自动变量,是不会自动初始化的,------声明一个整型的指针并非伴随着自动创建一个整型变量的存储空间

  27. 对指针执行整数级别运算,系统会根据指针指向的类型对其进行调整

  28. 数组名代表的是指向数组元素类型的指针,该指针指向数组第一个元素的地址

  29. 初始化任何数组都是需要说明数组内元素个数

  30. 在进入程序后,无法修改数组首地址指针位置,因为该地址是一个指针常量

  31. sizeof(数组名)代表数组长度;&数组名—取出数组首地址

  32. 声明一个数组和一个指针的区别:数组—在声明中初始化明确了数组内元素个数,编译器为数组分配固定数值的内存,此时的数组名是一个指针常量;指针—定义一个指针,可能会出现未初始化的现象,且指针声明之后是一个变量

  33. 作为函数参数传入的数组名,此时传入函数的是一个指向数组首地址指针的拷贝,在函数中对数组名执行下标访问操作相当于对这个拷贝的指针执行间接访问操作

  34. 考虑一个前提"所有函数的参数都是传值操作",而传地址的概念实质是传递了一个指针的拷贝,这个拷贝就是传递的数值,然后通过对指针的间接访问实现了一个类似传地址的操作;当函数的入口参数是数组时,传递给函数的是一个数组的首地址指针的拷贝所以在函数定义与声明时,形参的定义是指针

  35. 二维数组作为形参传入函数,与一维数组不同在于二维数组内每个元素都是一个指向一维数组的指针所以函数原型的定义应该是
    void func(int (*mat)[10]) ;
    或者void func(int mat[][10]);
    需要在定义中明确的是二维数组中一维数组的维度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值