null第八章 指针第八章 指针教学目的要求:
1、重点掌握指针与指针变量
2、重点掌握并能灵活运用指针作为函数参数
3、了解指针函数和指向函数的指针
4、掌握指针与字符串以及指针数组
5、了解命令行参数
重点·难点:
1、指针与指针变量
2、指针作为函数参数
3、指针函数和指向函数的指针
4、指针与字符串以及指针数组
5、二维数组与多维数组的指针表示法null一、基本数据类型
整型、实型和字符型—单个数据处理。二、构造类型
数组—处理相同数据类型的数据集合。三、指针
是一种特殊的数据类型,通过它可以对
基本类型变量、数组变量等灵活的进行访问。数据类型回顾章节总览 指针是C语言中的一个重要的概念,也是C语言中的一个重要特色。正确灵活的使用指针:章节总览(1) 可以有效的表示复杂的数据结构;(2) 能动态分配内存;(3) 能方便使用字符串;(4) 有效而方便的使用数组;(5) 在调用函数时能得到多于1个的值,
能直接处理内存地址。 地址的概念(1)2.根据内存单元的地址访问内存单元的内容的方式(1)直接访问:
(2)间接访问: 变量的地址存放在另一个变量中
的方式称为“间接访问”方式。
如:i_pointer=&i;一、地址:地址的概念(1)指针变量另一个变量 按变量地址存取变量值的方式称为“直接访问”方式。1.定义:内存的每一个字节有一个编号,这就是地址。指针的概念(1 )指针的概念(1 )指针是存放另一个变量地址的变量
指针也是一种数据类型指针的概念( 2 )二、指针:
1.指针:
2.指针变量:
3.指针和指针变量的关系:
指针的概念( 2 )一个变量的地址称为该变量的“指针”。 如果有一个变量专门用来存放另一变量
的地 址,则它称为“指针变量” (即指针) 。 指针变量的值(指针变量中存 放的值)
是指针(地址)。指针变量(1)一、指针变量的定义和赋值:
1、概述:
(1)指针变量不同于整型变量和其他类型变量,它是用来
专门存放地址的。必须将它定义为“指针类型”。
(2)指针变量的基类型用来指定指针变量所指向的变量
的类型,不可缺少。
pointer_1,pointer_2用来指向整型变量,但不可以用来指向其他类型的变量。指针变量(1)例如: int i , j ;
int *pointer_1 , *pointer_2 ;指针变量(2)2 、定义的一般形式:基类型 *指针变量名
3、赋值:一个指针变量指向另一个变量:
如:pointer_1=&i;
pointer_2=&j;
变量i , j 的地址被分别存放到指针变量pointer_1和pointer_2
中,这样,pointer_1指向了变量i , pointer_2指向了变量j。指针变量(2)注意:定义时, “*”表示该变量的类型为指针类型;
而指针变量的名称为:pointer_1,pointer_2注意:指针变量中只能存放地址(指针),不能将任
何其他非 地址类型的数据赋给一个指针变量。 pointer_1=100; 是非法的。指针变量(3)指针变量(3)二、指针变量的使用:1、 两个有关的运算符:
(1)& 取地址运算符
(2)* 指针运算符(或称“间接访问”运算符),非定义
时出现,用于求指针(地址)所指向的变量。例如: int a , * p; p=&a; *p=3;
& a 为变量 a 的地址
* p 为指针变量p所指向的变量a变量的指针和指向变量
的指针变量总述:
1、变量的指针就是变量的地址。
2、存放变量地址的变量是指针变量,用来指向另一个
变量。
3、为了表示指针变量和它所指向的变量之间的联系,
在程序中非定义时用“*”表示“指向”。
例如:已知:int i , * p; p=&i ;下列两个语句作用相同
(1) i=3; (2)*i_pointer = 3;
变量的指针和指向变量
的指针变量指针变量i_pointer,与普通变量的区别;
*i_pointer是i_pointer所指向的变量
*i_pointer也是一个变量,它和所指向的普通变量是等价的指针变量举例(1)指针变量举例(1)main()
{
int a , b ;
int *pointer_1 , *pointer_2 ;
a=100 ; b=10 ;
pointer_1=&a;
pointer_2=&b;
printf("%d,%d\n", a , b );
printf("%d,%d\n", *pointer_1 , *pointer_2 );
}结果:
100,10
100,10/*把变量a的地址给pointer_1*//*把变量b的地址给pointer_2*/指针变量(4)关于& 和 * 的运算(& 和 * 的优先级相同)
(1)若有&*pointer_1
(2)若有*&a
(3)(*pointer_1) + +指针变量(4)再进行 * 运算,得到 & a 所指向的变量& a*pointer_ia先进行*pointer_i的运算,即为变量a;再进行&运算,即为&a;表达式的值最终为 a 的地址先进行 & a 运算,得到 a 的地址,即pointer_1或 &a;a+ +int a, *pointer_1;
pointer_1= &a;null(1) int *p=&a; (2)*p=a;
A.语句(1)和(2)中的*p含义相同,都表示给指针变量p赋值
B.(1)和(2)语句的执行结果,都是把变量a的地址值赋给指针变量p.
C.(1)在对p进行说明的同时进行初始化,使p指向a;(2)将变量a的值赋给指针变量p
D.(1)在对p进行说明的同时进行初始化,使p指向a;(2)将变量a的值赋给*p例 若已定义int a=5;下面对
(1)、(2)两个语句的正确解释是:答案:D指针变量举例(2)指针变量举例(2)main()
{
int *p1, *p2, *p, a, b;
p1=&a; p2=&b;
scanf("%d,%d",&a,&b);
if(a
q 若为真则表示p在数组中指向的数组元素排列在q所指向的元素之后。
注意:要求p、q为同类型的指针变量指 针 变 量(5)指 针 变 量(5)三、指针变量作为函数参数:
(1) 函数的形参的类型不仅可以是整型、实型、字
符型等数据,还可以是指针类型。
作用:是将一个变量的地址传送到函数中。
(2)函数的类型(返回值的类型)也可以是指针类型指 针 变 量 举 例(3)指 针 变 量 举 例(3)swap(int *p1,int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=temp; }
main()
{ int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a; pointer_2=&b;
if(a题程序:(教材254页)
小结:
利用指针数组作main函数的行参,可以向程序传送命令行参数(这些参数是字符串),这些字符串的长度不可知,而且各参数字符串的长度一般并不相同,命令行参数的数目也是任意的。用指针数组可以较好的满足上述要求。有关指针的数据类型和指针运算的小结 (1) 一、有关指针的数据类型的小结
int I; 定义整型变量I
int *p; p为指向整型数据的指针变量
int a[n]; 定义整型数组a,它有n个元素
int *p[n]; 定义指针数组p,它由n个指向整型数据的指针数
据组成
int (*p)[n]; p为指向含n个元素的一维数组的指针变量
int f(); f为带回整型函数值的函数
int *p(); p为带回一个指针的函数,该指针指向整型数据
int(*p)(); p为指向函数的指针,该函数返回一个整型值
int **p; p是一个指针变量,他指向一个指向整型数据的指
针变量有关指针的数据类型和指针运算的小结 (1) 有关指针的数据类型和指针运算的小结 (2) 有关指针的数据类型和指针运算的小结 (2) 二、指针运算小结
1. 指针变量加(减)一个整数
一个指针变量加(减)一个整数并不是简单的将指针
变量的原值加(减)一个整数,而是将该指针变量的
原值(是一个地址)和它指向的变量所占用的内存单
元字节数相加(减)。
2. 指针变量赋值:将一个变量地址赋给一个指针变量。
注意:不能将一个整数赋给指针变量,同样不能将指针变
量的值(地址)赋给一个整型变量。
有关指针的数据类型和指针运算的小结 (3) 有关指针的数据类型和指针运算的小结 (3) 3.指针变量可以有空值,即该指针变量不指向任何变量,表示为:
p=NULL;
4.两个指针变量可以加减
5.两个指针变量比较
三、void指针类型
void类型的指针,即可以定义一个指针变量,但不指定它
是指向哪一种数据类型。 有关指针的数据类型和指针运算的小结 (4) 有关指针的数据类型和指针运算的小结 (4) 3. 使用scanf函数时应注意的问题:
(1)scanf函数中的“
控制”后面应当是变量地址,而不应是变量名。
(2)如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。
(3)在用“%c”格式输入时,空格字符和“转义字符”都作为有效字符输入。
(4)在输入数据时,遇以下情况时该数据认为结束。
a.遇空格,或按“回车”或“跳格”(Tab)键。
b.按指定的宽度结束。
c.遇非法输入。null例有若干个学生的成绩(每一个学生有4门功课),要求在用户输入学生序号后,能输出学生的全部成绩。例对上例中的学生,找出其中不及格课程的学生及其学号。 2、例题分析:null一、指向数组元素的指针变量
main()
{ int a[3][4] ={ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23 };
int *p;
for(p=a[0];p