C指针编程之道_第1页
C指针编程之道_第2页
C指针编程之道_第3页
C指针编程之道_第4页
C指针编程之道_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章 指针变量的值就是地址 指针变量定义的一般形式 类型说明符 变量名 1 类型说明符 表示该指针变量指向的变量的数据类型 且该指针变量只能只想该数据类 型 的变量 特型 使用指针变量时必须进行的操作 即是给指针变量赋值 让其指向指定的内存单元 指针变量在使用前 必须要让其指向某个具体的变量 即指向某个具体的内存单元才能正 确引用 1 2 3 小结 指针是一种数据类型 专门存放地址的数据类型 俗称的指针式指地址 指针式常量 然 而指针变量时变量 指针变量既是 pStu 指针变量使用前必须指向具体有效的内存单元 地址运算符 指针变量指向数组 pStr str str 已经定义为数组 输出定义的数组 printf str s n str 由于 str 是一个字符串 则会输出整句 p 是输出内存地址 数组名是常量 指针变量时变量 下标法必须通过额外的变量来充当编号 用于访问每一个元素 指针只要知道数组的首地 址就可以访问所有的元素 数组较大时 用指针法访问比较方便 编译器在编译数组时 是按数组首地址加上各元素的偏移量的方式找到相应元素 再进行 编译 既是指针法的方式 高效性体现 数组越大 优越性越明显 指针数组定义的一般形式 由指针变量组成的数组 类型说明符 数组名 数组长度 类型说明符 表示指针值所指向的变量的类型 数组名 表示这是指针数组 如 int num 3 定义为这是一个指针数组 每个数组元素都是一个指针变量 该指 针变量指向 int 类型的数据 可以表明 name 0 china name 1 beijing name 2 longmai 指针数组较多的用来访问字符串 字符串指针变量指向字符串的首地址 可以移动字符串指针变量 第 3 章 函数是为了完成没想特定功能而编写的程序块 函数参数可以分为两种 1 传递的是变量的数值 称为普通参数 2 传递的是变量的地址 称为指针参数 在函数中形参的变换不会让实参也发生变化 因为在函数调用时 给形参分配了独立的 内存空间 实参把值传递给形参 实际只是 copy 其内存地址的内容去到形参的内存地址 所以形参交换不会影响实参 形参与实参虽然是同样的值 但是存储在不同的内存地址 所以要完成函数调用时并进行实参的交换就要用到指针 在函数调用时把指针作为函数参数 既是传递变量的地址 在被调函数中 通过指针操作相应的变量就是直接操作本身 改变形参就是改变实参 如 定义 Swapdata char p dat x char p dat y 定义 char p x p y 定义 char x y 有 p x p y Swapdata p x p y 在函数 swapdata 中的操作既是对于 x y 的直接操作 0 x 表示 16 进制 设定结构体时 如 Struct Char head Char len Char add Char data 3 Char chk RF FRAME 定义 RF FRAME ptr tmp 且定义了结构 RF FRAME txbuf Ptr tmp txbuf 则指针 ptr tmp 指向结构 txbuf 的首地址 小结 指针变量作为实参时 实际是让形参同时指向实参指向的数据单元 同样是值传递 同样 的单向传递 普通参数作为实参进行传递不能改变实参的内容 而指针函数作为实参时 很容易实现实参的改变 一个函数只有一个函数指针 不能够通过函数指针的移动来访问函数体中的语句 如果一个指针指向一个函数 可以通过这个指针变量来访问这个函数 函数指针的定义形式 数据类型 变量名 数据类型 表示函数返回值的类型 变量名 不能省略 优先级比 高 若省略变量名会与后面的 结合 省略了 就变成指针函数了 如 int p str 数据类型为 int 表示返回值为 int p str 表示这是一个指针变量 变量名为 p str 初始化函数指针 定义函数 Void output 定义函数指针 Void p output 初始化函数指针 p output output 使用为 p output 区别 指针函数 返回值是指针的函数就是指针函数 函数指针是地址 指针函数是函数 表示为 int p str 指针函数的定义方式 类型说明符 函数名 形参 函数体 第 4 章 要对二维数组整体赋值 只能在定义时初始化 不能定义完后 在赋值会出现编译错误 如 编译错误 Int data 2 2 Data 2 2 1 2 1 2 正确 Int data 2 2 1 2 1 2 还可以顺序赋值无需花括号 Int data 2 2 1 2 1 2 还可以对部分赋值 Int data 2 2 1 1 2 Data 0 1 被默认赋值为 0 Ps 部分赋值后 其他的元素都会被默认赋值为 0 可以得出 只定义不初始化 数组元素值是未知的 定义且初始化 未初始化部分为 0 p 输出内存地址 二维数组的元素也是连续存放的 指针的指针 指针变量是存放数据变量的地址 而指针的指针就是存放这些指针变量的地址 数据类型 变量名 数据类型 指针变量指向的数据的类型 是从右到左的结合方式 第二个 与变量名结合后称为指针变量 假设为 p 也称为一级指针变量 然而第一个 与一级指针变量结合既是 p 也是定义了一个指针 称为二级指针是指向指 针类型的数据 数据类型是一级指针说指向的数据的类型 二级指针指向的类型的指针类型 多维数组 数组访问 直接访问 a i 通过指针访问 a i 对于 grid 3 4 grid 0 是 grid 0 0 grid 0 1 grid 0 2 grid 0 3 数组名 同理 grid 1 grid 2 也分别都是数组名 而 grid 就是 grid 0 grid 1 grid 2 的数组名 用指针发访问 grid i 可用 grid i 并且此访问法是访问 grid i 0 的地址 所以有 grid i j 如 grid i j 既是可以用 grid i j 第 5 章 一般内存被分为 5 个分区 全局区 代码区 常量区 堆和栈 全局区 存放在这个区域的数据 在整个程序的运行期间都是有效地 也就是生存期贯穿 整个程序运行期 用以存放全局变量 静态变量 全局区的分配释放均由编译器自动完 成 堆 动态内存的分配与释放 运行时有大量有用的数据 但只是临时的 不需要持续保留 这是就要分配内存来保存 也是由 new 分配的内存块 如建立一个新的对象等等 栈 被调函数本身以及函数本身使用的变量称为局部变量 调用函数是分配空间 函数结 束后 自动释放 函数形参等数据存放在栈区 5 1 1 重点 动态内存分配 库函数 stdlib h 包含了多种不同的分配内存的函数 函数 1 Void malloc unsigned int num type 系统为用户分配一个 num type 字节的空间 返回值是一个 void 型的指针 所以在实际运用时需要强制转换类型 void 类型可以强制转换为任何其它类型的指针 当分配成功时返回指向被分配内存的指针 此存储区中的初始值不确定 否者返回 null new 和 malloc 的区别 例子 从函数声明上可以看出 malloc 和 new 至少有两个不同 new 返回指定类型的指针 并 且可以自动计算所需要大小 比如 int p p new int 返回类型为 int 类型 整数型指针 分配大小为 sizeof int 或 int parr parr new int 100 返回类型为 int 类型 整数型指针 分配大小为 sizeof int 100 而 malloc 则必须要由我们计算字节数 并且在返回后强行转换为实际类型的指针 int p p int malloc sizeof int 128 分配 128 个 可根据实际需要替换该数值 整型存储单 元 并将这 128 个连续的整型存储单元的首地址存储到指针变量 p 中 double pd double malloc sizeof double 12 分配 12 个 double 型存储单元 并将首地 址 存储到指针变量 pd 中 另外有一点不能直接看出的区别是 malloc 只管分配内存 并不能对所得的内存进行初始 化 所以得到的一片新内存中 其值将是随机的 函数 2 Void calloc unsigned num unsigned size 参数包含元素的数量和每个元素的字节数 Calloc 分配的内存空间大小有 num 和 size 决定 在内存的动态存储区中分配 n 个长度为 size 的连续空间 函数返回一个指向分配起始地址 的指针 如果分配不成功 返回 NULL 该指针使用时也应该进行判断是否为 null 跟 malloc 的区别 calloc 在动态分配完内存后 自动初始化该内存空间为零 而 malloc 不初始化 里边数据 是随机的垃圾数据 函数 3 Void realloc void ptr size t size 功能功能 先按照 ptr 指定的大小分配空间 将原有数据从头到尾拷贝到新分配的内存区域 而后释放原来 mem address 所指内存区域 同时返回新分配的内存区域的首地址 即重新 分配存储器块的地址 返回值返回值 如果重新分配成功则返回指向被分配内存的指针 否则返回空指针 NULL 注意 注意 这里原始内存中的数据还是保持不变的 当内存不再使用时 应使用 free 函数将内 存块释放 1 如果有足够空间用于扩大 mem address 指向的内存块 则分配额外内存 并返回 mem address 这里说的是 扩大 我们知道 realloc 是从堆上分配内存的 当扩大一块内存空间时 realloc 试图直接从堆上现存的数据后面的那些字节中获得附加的字节 如果能够满足 自 然天下太平 也就是说 如果原先的内存大小后面还有足够的 空闲空间用来分配 加上原 来的空间大小 newsize 那么就 ok 得到的是一块连续的内存 2 如果原先的内存大小后面没有足够的空闲空间用来分配 那么从堆中另外找一块 newsize 大小的内存 并把原来大小内存空间中的内容复制到 newsize 中 返回新的 mem address 指针 数据被 移动了 内存的释放 Void free void ptr Ptr 是指定需要释放的地址 内存释放只是把这块内存的数据变为无效数据 指针 ptr 依然指向这块内存 所以释放内存时也要释放指针 也可将指针指向 null 5 2 队列 队列的基本操作 入队 出队 判队空 判队慢 指针 front 指向对头 指针 rear 指向对位的待插入数据的位置 队列初始化就是让指针 front 和 rear 指向队尾的同一个位置 表示队列为空 首先介绍一下 C 中的结构 对于一个结构来说 struct MyStruct int member a 如果有个变量 MyStruct s 那么使用其中的成员元素时可以用 s member a 1 如果采用指针方法访问 比如 MyStruct ps 那么同样的访问必须用箭头号 ps member a 1 int data a 5 int data b new int 如果没有为指针分配地址 就不要使用 开始没有为指针 data b 分配地址使得后面内存出错 对于 i 和 i i 相当于 先入栈 再自增 i 相当于 先自增 再入栈 5 4 链表 从内存角度划分有静态链表和动态链表 而从储存方式划分有单链表 多链表以及循环链 表 链表由多个链表元素组成 这些元素称为节点 节点之间通过逻辑连接 形成链式存储 链表的节点包含两个域 一个是值域用于存储节点值 另一个是链域 用于存储下一个 节点的地址和位置 节点之间就是通过链域来形成逻辑关系的 动态链表动态的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论