程序设计基础(C语言)9
程序设计基础(C语言) 东北大学高级语言程序设计课程组 课程网站:/cxsj 程序设计基础(C语言) 指针 概述 指针是C语言的重要概念之一 它使C语言比之其它程序设计语言更具特色 深入理解C语言特性 指针是学习使用C语言的难点 指针是C语言的一个重要概念 正确而灵活地使用指针 有效地描述各种复杂的数据结构 动态地分配内存空间 自由地在函数之间传递各种类型的数据 使程序简洁、紧凑,执行效率高 指针是C提供的一种数据结构 属于简单数据类型 它的意义和作用明显又不同于一般的数据类型 1.预备知识 C语言如何处理? 高级语言中的变量具有三个属性 变量的名、变量的值、变量的地址 编程者使用c程序的一个变量 定义变量的数据类型 数据类型决定了一个变量在内存中所占用的存储空间的大小 变量在内存中总是占用几个连续的字节 定义变量名 C语言的编译系统会根据变量的数据类型为该变量分配内存单元 确定变量的地址 变量的地址就是为变量分配的内存单元的起始编号 就可以通过变量名对内存中变量对应的地址进行操作 1.预备知识 C语言如何处理? 直接访问 通过变量名访问数据的方式称为"直接访问" 例如:printf("%d", n); /* 通过变量名访问变量n */ 间接访问 如果将变量n的地址存放在另一个变量pn中,通过访问变量pn,间接达到访问变量i的目的,这种方式称为变量的"间接访问" 在C语言中,间接寻址方式访问内存是通过指针变量实现的 指针变量通过直接寻址方式访问获得的是一个地址值 在该地址起始的一个存储单元中存放程序需要的数据 2.指针变量 定义 用于指向其他变量的变量 指针变量是一个变量 和普通变量一样占用一定的存储空间 该存储空间存放的是一个地址值而不是普通的数据值 指针变量是一个地址变量 指针变量的值是一个内存单元的地址 它指向另一个变量的值 指针就是地址 当将变量的地址存入指针变量后,就说这个指针指向了该变量 指针变量只能存放某一数据类型的变量 问题? 变量的类型和指向变量的类型之间的区别? 2.指针变量 指针变量的声明 指针变量与一般的变量的区别 格式 *指针变量名; 说明 数据类型表示指针所指向的数据的数据类型 提示:不是指针变量的数据类型 *是指针的标志,表示它后面的变量名是指针类型 例 int *i_p;/*定义了指针变量i_p ,指向的对象类型为整型*/ char *cp;/*定义了指针变量cp, 指向的对象类型为字符型*/ 2.指针变量 指针变量的声明 提示 声明语句的*只能用于指针变量 这种表示方式说明被声明的变量是一个指针 *不针对声明语句中的所有变量 每一个指针都必须在其名字前面有一个前缀*声明 例如:int *pt1,pt2; pt2为整型变量而不是整型指针变量 指针变量名是pt1而不是*pt1 指针变量只能指向定义时规定的类型变量 只有同一数据类型的地 址才能存放在指向该类型变量的指针变量中 例如: int *ip;/*ip指针变量只能存放整型变量的地址*/ 2.指针变量 指针变量的声明 提示 在定义指针时可以用void将指针定义为空类型 不指定指针指向一个确定的类型 区分“值”与“内容”的含义 例如 整型变量是内容为整型数值的变量 整型指针变量是存放整型变量地址的变量 在引用指针变量前必须首先让指针指向一个变量 这一点非常重要 定义指针变量后,并未确定该变量指向何处,该变量的值是不确定的 2.指针变量 指针变量初始化 在使用指针变量时,要首先对指针变量进行初始化,让指针变量指向一个具体的变量 初始化的方式 使用赋值语句 例 int i, *pi; /* 说明指针变量pa和变量a */pi=&i; /*使用取地址符&把变量i的地址赋值给指针变量:pi指向了整型变量i */ 说明指针变量的时候同时进行 例:使用先声明变量的地址 int i,*pi=&i; 问题? 写成int *pa; *pa=&a;会出现什么问题? 2.指针变量 指针变量初始化 在使用指针变量时,要首先对指针变量进行初始化,让指针变量指向一个具体的变量 初始化的方式 给指针变量赋空值(赋值为符号常量NULL ) 例 p=NULL;/*表示指针p为空,没有指向任何对象*/ 一般情况下给没有初始值的指针变量赋值为NULL 实际上,NULL是整数0,系统保证0单元不存储任何数据的值(地址) NULL是头文件以及其它几个头文件中定义的符号常量 2.指针变量 指针变量初始化 提示 在使用指针之前一定要对其进行初始化 否则程序不知道指向何处 系统在执行程序时会给出如下的信息 run-time error R6001——null pointer assigment 或者引起更