C语言深度剖析笔记(三)

指针

  • 将数值存储到指定位置
    int *p = (int *)0x12ff7c;
    *p =0x100;

    *(int *)0x12ff7c =0x100;

数组

32位系统下
int a[5];

  • sizeof(a)=sizeof(int)*5=20

  • sizeof(a[0]) = sizeof(int)=4

  • sizeof(a[5]) =4

  • sizeof(&a[0])=4

  • sizeof(&a) =4

  • &a[0]和&a值相同,但意义不同。前者为数组首元素的地址,后者为数组的首地址。

  • 数组名 a 作为右值时代表数组首元素的地址

  • 数组名 a不能作为左值

数组与指针

  1. 以指针形式访问指针和以下标形式访问指针 char *p = “abcdefg”
    • 以指针的形式:*(p+4);
    • 以下标的形式:p[4];
  1. 以指针形式访问数组和以下标形式访问数组char a[] = “123456”
    • 以指针的形式:*(a+4);
    • 以下标的形式:a[4];
  • 一个类型为T的指针的移动,以sizeof(T)为移动单位。

    • &a+1:下一个数组的首地址
    • (int*)(&a+1):强制转换为(int*)类型
    • *(a+1):数组下一个元素的地址。
  • 指针数组:数组元素全为指针,数组占多少字节由数组本身决定。

  • 数组指针:指向数组的指针,32位系统下永远是4字节。

int p1[10]:指针数组([]优先级高于*)
int (*p2)[10]:数组指针

数组参数和指针参数

  • 无法向函数传递一个数组,一维数组作为函数参数时,总是把它解析成一个指向其首元素首地址的指针

  • 函数本身没有类型,只有函数的返回值才有类型

  • 无法把指针变量本身传递给函数。

内存管理

  • 堆:由malloc系列函数或new操作符分配的内存·~~~~~~~~~~~使用灵活,空间较大,但容易出错
  • 栈:保存局部变量~~~~~~~~~~~效率高,但空间大小有限
  • 静态区:保存自动全局变量和static变量
常见内存错误:
  1. 指针没有指向一块合法内存
    结构体成员指针未初始化
    没有为结构体分配足够的内存
  2. 为指针分配的内存太小
  3. 内存分配成功,但未初始化
  4. 内存越界
  5. 内存泄漏
  6. 内存已释放,但继续通过指针来使用

函数

  • 降低复杂度、避免重复代码段、限制改动带来的影响、隐含顺序、改进性能、进行集中控制、隐含数据结构、隐含指针操作、隐含全局变量。

风格

  • 每个函数必须由注释

  • 函数定义结束及明文件结束之后加上一个或若干个空行

  • 函数体内,变量定义和函数语句之间要加空行

  • 逻辑关系密切的语句之间不加空行,其他地方加空行分隔

  • 分支语句、循环语句结束后要适当注释,以便区分各分支或循环体

  • 缩行显示程序结构,缩进量统一4个字符

  • 同层次代码要在同层次的缩进层上

  • 若函数参数较长,要适当划分

  • 运算符较多时,要用括号确定表达式的操作顺序

  • 尽量避免含有否定运算的条件表达式

  • 若缺省返回值类型,编译器默认返回值类型为int类型

  • 尽量使用assert宏做函数体入口校验

  • return语句不可返回指向“栈内存”的指针,因为该内存在函数体结束时被自动销毁

  • getchar函数返回值为int类型

  • 初始化非零数组和结构图时要用花括号配对

  • 使用strncpy库函数代替strcpy库函数

  • 标准库中保留的标识符、宏和函数,不能被定义、重定义或取消定义

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值