收藏 分享(赏)

C语言编程之指针.ppt

上传人:gnk289057 文档编号:7972856 上传时间:2019-06-01 格式:PPT 页数:26 大小:225KB
下载 相关 举报
C语言编程之指针.ppt_第1页
第1页 / 共26页
C语言编程之指针.ppt_第2页
第2页 / 共26页
C语言编程之指针.ppt_第3页
第3页 / 共26页
C语言编程之指针.ppt_第4页
第4页 / 共26页
C语言编程之指针.ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、C语言编程之指针,姚延栋 2009-04-01,指针与C语言,指针是C语言的精髓, 精通指针是精通C的前提. 指针是C语言最大的陷阱, 误用指针后患无穷.,Agenda,指针的概念 指针的操作符 指针的运算 指针和数组 指针和函数 指针和结构体 指针和动态内存分配,变量的概念,变量是一个标识符, 对应一个内存地址块. 变量有两个值(默认说变量的值时指的是rvalue): lvalue: 变量对应的内存地址的值: x = y; rvalue: 变量对应的内存地址所存储的值: z = x; 变量的类型: 决定了占用内存块的大小. sizeof() 变量是给程序员看的, 而内存地址是给程序/机器看

2、的,x 0xFC,内存,符号表,256,0xFC,static int x = 256;,指针,指针是一个变量, 是一个特殊的变量, 特殊之处在于: 指针变量的类型: 变量类型决定了占用内存块的大小, 而所有指针变量占有内存块大小相同 lvalue: 指针变量的左值和普通变量的左值一样, 都是该变量所对应的内存的首地址 rvalue: 指针变量的右值不是一个普通的值, 被编译器解释为另一个变量的地址. 关键在于编译器对之特殊解释 指针实际上提供了一种间接内存访问的方式,程序员通过指针操作符来访问指针所指向的变量的值,指针的四个方面,类型: 指针变量的类型 指针变量所指向的类型 值 指针变量的左

3、值(lvalue) 指针变量的右值(rvalue),指针的类型(指针是个什么类型的指针),类型决定占用内存块的大小: 所有指针占用内存块大小相同, 32位程序是 32 位, 64位程序是64位. 从语法的角度, 把声明中的指针名字去掉, 剩下的就是指针的类型. int *ptr; / 指针的类型是 int * int *ptr; / 指针的类型是 int* int (*ptr)3; / 指针的类型是 int (*)3,指针所指向的类型,当使用指针来访问指针所指向的内存区时, 指针所指向的类型决定了编译器将如何看待那片内存区里的内容, 从语法上, 只要把声明语句中指针名字和名字左边的指针声明符号

4、 * 去掉, 剩下的就是指针所指向的类型. int *ptr; / 指针所指向的类型是 int int *ptr; / 指针所指向的类型是 int * int (*ptr)3; / 指针所指向的类型是 int ()3 在指针的算数运算中, 指针所指向的类型有很大的作用.,指针的左值(lvalue),指针的左值和普通变量一样, 即本身所占用的内存区的起始地址.,指针的右值(rvalue),指针的右值(rvalue)是指针本身存储的数值, 这个值被编译器当作一个另一个变量的地址, 而不是一个一般的数值. 指针所指向的内存区 起始地址: 指针的右值(rvalue) 大小: sizeof(指针所指向的

5、类型) 指针的值是0xffff 指针指向了以0xffff为首地址的一个内存块,综合指针的四个方面,i 0xA0A0A0A0p 0xB0B0B0B0,符号表,32位内存地址空间,0x00000000,0xA0A0A0A0,0xB0B0B0B0,256,0xA0A0A0A0,0xFFFFFFFF,static int i = 256; static int *p = ,指针p的类型: int* 指针p所指向类型: int 指针p的lvalue: 0xB0B0B0B0 指针p的rvalue: 0xA0A0A0A0 指针指向的内存块的值: *p (* 为解引用操作符),Agenda,指针的概念 指针的

6、操作符 指针的运算 指针和数组 指针和函数 指针和结构体 指针和动态内存分配,操作符: 程序员使用指针的唯一方式,32位内存地址空间,0x00000000,0xA0A0A0A0,0xB0B0B0B0,256,0xA0A0A0A0,0xB0B0B0B0, 注意: 起始地址 vs. 类型大小,p,i,ptr,0xB5B5B5B5,Agenda,指针的概念 指针的操作符 指针的运算 指针和数组 指针和函数 指针和结构体 指针和动态内存分配,指针的算数运算,指针的值是内存地址, 因而是一个无符号整数, 这个整数可以进行算数运算, 但是和通常的数值加减运算意义不一样 常见形式 (pointer) = (

7、pointer) (pointer) = 0 or NULL (pointer) = (pointer) + (int) (pointer) + or (pointer) - (int) = (pointer) (pointer),指针运算的基本单位,为指针所指向类型的大小 char *p = “hello world!”; p+;int a = 20, 21, 22; int *p = a; p+;,H e l l o w o r l d ! 0,20 21 22,稍微复杂的例子,#include int main(int argc, char * argv) char a20 = “hel

8、lo world!“;char (*p)20 = rootyydzero pointer# ./a.out 1185685792 1185685812,Agenda,指针的概念 指针的操作符 指针的运算 指针和数组 指针和函数 指针和结构体 指针和动态内存分配,指针和动态内存分配,加载程序时分配内存 运行时动态内存分配 栈内存分配: 由编译器控制 堆内存分配: 由程序员控制,分配一段连续的内存空间, 并返回一个指针. C+ 提供了new操作符 void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); void fre

9、e(void *ptr) void *realloc(void *ptr, size_t size),例子,int *p = (int *)malloc(sizeof(int) * 20);*p = 2009; *(p + 1) = 2010;free(p);,20092010,0,1,19,p,陷阱之一: 忘记初始化,未初始化的指针变量的值不确定 解引用(Dereference)导致随机地址访问, 造成覆盖已有变量的值, 段错误等, 非常难以调试. Void func() int *p;*p = 256; 方法: 声明时总是初始化(int *p = NULL),陷阱之二: NULL 指针,指

10、向 NULL 的指针不能解引用, NULL 基本上等价于 0 访问会造成 段错误 方法: 在访问指针内容前进行有效性判断, 通常在函数入口处进行. void func(char *ptr) if (ptr = NULL) ,陷阱之三: 野指针,野指针:指向的地址空间已经被释放的指针 常见原因: 函数内的局部变量, 分配在栈上, 函数返回后释放 多个指针指向一个空间 使用某些工具调试,陷阱之四: 释放不当,free 和 malloc 等必须一一匹配: 同一个指针释放两次free(ptr);free(ptr); 释放和申请时地址不同ptr += 1;free(ptr) 释放非动态内存地址int i = 10;int *p = 使用某些工具调试,陷阱之五: 内存泄露,分配的内存没有释放 程序退出时会释放所有已经分配的内存 程序一直运行, 且循环不断的分配新的内存, 导致内存不够用, 系统变的非常慢 及时释放不用的指针 使用某些工具调试,Q & A,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报