C语言基础-零散知识点总结(一)

序言

上次华为面试重新复习了一下C语言的基础知识,在这里做个总结。

1

  • 全局变量和局部变量:

    • 全局变量和局部变量可以重名,但局部变量会屏蔽全局变量。
    • 引用全局变量的两种方式:extern关键字 + .h头文件包含,编译出错期分别为:编译期,链接期
    • .h头文件定义的全局变量,可以在不同的.c文件中以static来声明此同名全局变量,不过只可有一个.c中对此变量进行赋值,避免链接出错
  • a++和++a

    • a++:先参与运算再加1
    • ++a:先加1再参与运算
  • static全局变量/局部变量/函数

    • static全局变量:静态存储;作用域-定义该变量的源文件;可避免在其他源文件中引起错误
    • 非static普通全局变量:静态存储;作用域-各个源文件
    • static局部变量:生存期-局部变量改为静态局部变量之后改变了它的存储方式和生存期;只初始化一次,下一次依据上一次结果值
    • 普通局部变量:生存期-该函数的执行期间
    • static函数:作用域-仅在本源文件;在当前源文件中定义和说明
    • 普通函数:作用域-在一个头文件中说明,各源文件中包含该头文件
    • 局部变量:存在于栈(static)中,如int a,b;
    • 全局变量(静态和非静态):存在于静态区中,都是静态存储
    • 动态申请的数据:存在于堆中,如malloc(),new []
  • struct和union的区别

    • 偏移量:结构体的偏移量根据对齐大小进行确定,有自然对齐和指定对齐方式;共用体没有偏移量的概念。
    • 实际分配的大小:结构体实际分配大小不小于成员空间总和且满足对齐大小的整数倍;共用体实际分配的大小不小于最大成员的大小且满足对齐大小的整数倍。
  • 测试分类

    • 人工测试:个人复查、抽查和会审
    • 机器测试:黑盒测试(针对系统功能的测试)、白盒测试(测试函数功能和各函数接口)
  • IP电话的原理:又称IP Phone,VoIP

    • 原理:语音压缩 -> 封装IP -> 传输 -> 解IP -> 语音解压缩
  • Socket通信TCP/UDP

    • TCP客户端:socket() -> connect() -> send() -> recv() -> close()
    • TCP服务端:socket() -> bind() -> listen() -> accept() -> recv() -> send() -> recv() -> close()
    • UDP客户端:socket() -> sendto() -> recvfrom() -> close()
    • UDP服务端:socket() -> bind() -> recvfrom() -> sendto()
  • 进程和线程的对比维度

    • 数据共享,内存占用、CPU利用率,创建销毁切换速率,编程调试难度,并发性,可靠性
  • 网络编程中多进程和多线程的区别:

    • 进程和线程的常见区别
    • 线程执行开销小,不利于资源管理保护,适合于SMP(多处理器对称并行技术)机器运行;进程执行开销大,便于资源管理保护,适合于跨机器迁移。
  • 函数和操作符

    • 函数:malloc(),strlen()
    • 操作符:new,sizeof
  • 判断带环单链表环出现的地方:

    • 设置两个变量,一个递增1,一个递增2,指向同一节点时就是环出现的地方
  • 用一条语句判断一个数是否是2的幂次:i & (i-1),按位与


2

  • 常量指针和指针常量

    • char *const p:常量指针,p的值不可修改
    • char const *p:指针常量,指向的常量不可修改
    • const char *p:与char const *p,指向常量的指针
  • 数组和指针的内存空间

    • str1[] = “abc”,str2[] = “abc”,str3[] = “abc”,str4[] = “abc”
    • *str1 = “abc”,*str2 = “abc”,*str3 = “abc”,*str4 = “abc”
    • str1,str2,str3,str4是数组变量,有各自的内存空间;str1,str2,str3,str4是指针,指向相同常量区域
  • 大小写字母、数字转换

    • 小写字母 -> 十进制数字:str[i]-87
    • 大写字母 -> 十进制数字:str[i]-55
    • 数字字符 -> 十进制数字:str[i]-‘0’
    • 小写字母 -> 大写字母:str[i] = str[i] - (‘a’ - ‘A’)
  • sizeof

    • 只能测量静态数组大小,无法检测动态分配的或外部数组大小
    • sizeof()不是函数,是操作符,sizeof(字符串)不计结束符
    • 数组名作为函数参数,退化为指针:void fun(char str[]); sizeof(str) = 4
    • 数组名作为sizeof()参数,数组名不退化: char str[6]; sizeof(str) = 6
  • 指针位数:指针多少位只要看地址总线的位数即可

    • 32位机器:4字节32位
    • 64位机器:8字节64位
  • 数组和数组指针:int a[5] = {1,2,3,4,5}; &a+1

    • a和&a地址一样,但意思不一样
      • a是数组首地址,即a[0]地址
      • &a是数组对象首地址,类型为int (*)[5]
    • a+1和&a+1
      • a+1:数组下一个元素地址,即a[1]
      • &a+1:下一个数组对象的地址,即a[5] (加了5*sizeof(int))
    • &a是数组指针,&a+1指指针+1,指加上整个数组长度 5*sizeof(int)
  • 指针和数组

    • char *a = “abcd”
      • 读写能力:存放于常量区,只可读不可改变
      • 赋值时刻:(常量)编译时就确定
      • 存取效率:静态存储区,慢
    • char a[20] = “abcd”
      • 读写能力:存放于栈,可访问可修改
      • 赋值时刻:运行时确定
      • 存取效率:栈,快
  • 宏定义:预处理阶段只作纯粹的替换和展开,无计算发生

    • 简单宏定义:
      • #define PI 3.14
        • #define N 2+2
        • int a = N*N
        • a = 8 = “2+2*2+2”
        • #define N (2+2) 推荐
        • int a = N*N
        • a = 16 = “(2+2)*(2+2)”
    • 带参数宏定义:
      • #define A(x) x
        • #define area(x) x*x
        • int y = area(2+2)
        • y = 8 = “2+2*2+2”
        • #define area(x) (x)*(x)
        • int y = area(2+2)
        • y = 16 = “(2+2)*(2+2)”
        • #define area(x) (x)*(x)
        • int y = area(2+2)/area(2+2)
        • y = 16 = “(2+2)*(2+2)/(2+2)*(2+2)”
        • #define area(x) ((x)*(x)) 推荐
        • int y = area(2+2)/area(2+2)
        • y = 1 = “((2+2)*(2+2))/((2+2)*(2+2))”
    • 宏的副作用
      • #define MIN(A,B) ((A) <= (B) ? (A) : (B))
      • MIN(*p++,b)
        • ((*p++) <= (b) ? (*p++) : (*p++))
        • 指针p会作3次自增操作
  • C语言中死循环的实现:while比较好用

    • while(1){}
    • for(;;)
  • 指针地址和指针内容的地址

    • printf(“%p”,&p) //指针的地址
    • printf(“%p”,p) //指针指向内容的地址
  • static和const关键字的作用

    • static:

      • (1) 全局变量:模块内的static全局变量可被模块内所有函数访问,但不能被模块外其他函数访问
      • (2) 局部变量:函数体内static变量作用域为该函数体,且其内存只被分配一次,下次调用上次的值
      • (3) 静态函数:模块内static函数只可被这一模块内其他函数调用,该函数使用范围限定在生命它的模块内
      • (4) 成员变量:在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝
      • (5) 成员函数:在类中的static成员函数属于整个类所拥有,该函数不接收this指针,因此只能访问static成员变量
    • const:

      • (1) 变量:欲阻止一个变量被改变,可用const关键字,定义时初始化
      • (2) 指针:可指定指针、指针所指数据或两者同时为const
      • (3) 形参:函数声明中,const修饰形参,表明其为一个输入参数,在函数内部不能改变其值
      • (4) 成员函数:对类的成员函数,若指定为const类型,则表明其为一个常函数,不能修改类的成员变量
      • (5) 成员函数:对类的成员函数,有时候必须指定其返回值为const类型,以使返回值不为“左值”
    • 注:左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式);在c语言中,通常来说有名字的变量就是左值,而由运算操作(加减乘除,函数调用返回值等)所产生的中间结果(没有名字)就是右值。



2017.05.03

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值