《征服C指针》摘抄

指针就是地址

cha1

  1. []比* 的优先级
    int * s[10];//s是数组
    int ( * s )[10];//s是指针
  2. void类型指针: 可以指向任何类型的指针类型
  3. 空指针 (NULL):没有任何一个对象的指针。 可初始化指针变量,以致使用无效指针时可以发现bug* 空字符(’\0’ 类型为int*):所有的位为0的字节 ANSI C "应该将0作为指针进行处理的上下文"的原则
  4. 形参为指针时,传递的时指针的副本,但引用的是本身

cha2

  1. 操作系统给应用程序的每个进程分配独立的“虚拟地址空间”(负责将物理内存分配给虚拟地址空间)。 当内存不足时,操作系统将物理内存中没被引用的部分倒腾出来,保存到硬盘上。

  2. 变量&储存期
    全局变量:函数外声明的变量,可从其他源代码文件中引用
    文件内部的静态变量:函数外定义的变量,加了static,作用域只限定在当前所在的源代码文件中
    局部变量:函数中声明的变量。通常在所在语句块结束时被释放,如果不想释放,可在局部变量上加上static进行声明。

    静态储存期,静态变量,全局变量、static变量,从程序运行时开始,到程序关闭时结束(一直存在于内存的同一个地址上)
    自动储存期,自动变量,没有指定static的局部变量,从程序进入所在语句块时被分配内存区域,到语句块执行结束后内存区域被释放(栈)
    malloc()分配,free()释放

  3. “函数名”意味着“指向函数的指针” 字符串(char的数组)

  4. 内存区域
    只读内存区域:函数(程序自身)和字符串常量(根据处理环境的不同,字符串常量也可能被配置在可改写的内存区域)
    自动变量:栈“重复使用” 调用函数时,为形参分配新的内存区域(即传值,像函数内部传递实参的副本)

  5. 源代码-编译->目标代码(符号表)-链接->可执行程序
    链接:相同名称跨源代码的函数和全局变量被视为相同的对象

  6. 可变长参数的函数
    参数由右到左依次压栈,这样第一个参数必定在最上面,所以无论有多少参数,第一个总能确定位置

  7. 递归调用:遍历树结构、图形结构中各元素、快速排序

  8. 动态内存分配函数
    malloc()//根据参数指定的尺寸来分配内存块,返回指向内存块初始位置的指针
    malloc()的实现:系统调用brk()设定内存区域的末尾地址,伸缩内存空间的函数;链表(管理区域)
    free()//释放内存区域。调用后对应的内存内容不会被马上破坏。
    :动态(运行时)进行内存分配,可以通过任意的顺序释放的记忆区域

  9. 其他的动态内存分配函数
    #include <stdlib.h>
    void * calloc(size_t nmemb, size_t size);//分配nmemb*size大小的内存区域,并将该区域清零返回。
    void *realloc(void *ptr, size_t size);//将ptr指定的区域尺寸修改成size,并返回指向新内存区域的指针。
    realloc(NULL,size)相当于alloc(size)

cha3

  1. 解读声明的顺序
    从标识符开始->整理内容的括号->表示数组的[]->表示函数的()->表示指针的*->左边的数据类型修饰符

  2. 派生类型:结构体、共用体、指针、数组、函数

  3. 数组=指针+元素个数
    int array[3];
    int (*array_p)[3];
    array_p = &array;//不能写成array_p=array; array(指向int的指针)和&array(指向数组的指针)在做指针运算时结果不同
    int hoge[3][2];//int数组(元素个数2)的数组(元素个数3) 注意前后顺序
    void func(int (*hoge)[2]);//等价于void func(int hoge[3][2]);

  4. 对象类型:有特定长度的类型
    函数类型只能派生出指针
    指向函数的指针类型可以组合成指针或作为结构体、共用体的成员。
    问:函数指针所占的字节数?
    答:函数指针,指向函数的第一条指令的地址。函数体的大小,不能通过sizeof() ,或者其他比较简单的C,C++内置逻辑获取。

  5. sizeof(char)=1
    结构体的成员“排列地”分配在内存中,
    共用体的成员则是“重叠地”分配在内存中

  6. 不完全类型:函数之外,类型地大小不能被确定的类型。
    仅仅是用于取得指针,是可以使用不完全类型的。

  7. char str[256];
    str和字符串常量都属于“指向char的指针”,都可以作为[]运算符的操作数

  8. 左值:表达式代表某处内存区域

  9. 运算符
    星号 是 解引用运算符
    &地址运算符
    const只读
    一旦给指针类型的参数设定const,当前层次以下的函数就必须全部使用const*

  10. 3.5.4 小节 :表达式中的“函数“可以被解读成“指向函数的指针”;表达式中函数是地址运算符&或者是sizeof的操作数时,表达式中的函数不是“指向函数的指针”,函数调用运算符( )时是“函数的指针”
    只有在“函数的形参的声明”中,数组的声明才能被解读成指针。

cha 4

  1. p163 可变长数组 malloc()
  2. 4.2小节 可变长数组的数组 —— 指针数组
    可变长数组的可变长数组 —— 指针的指针
    多维数组 —— 数组的数组 / 指向数组的指针

cha 6

strncpy(dest, src, len); //src长度大于len,dest不以空字符结束;src长度小于len,就用空字符补足剩余的长度

发布了20 篇原创文章 · 获赞 6 · 访问量 4636

猜你喜欢

转载自blog.csdn.net/better_eleven/article/details/104171872