指针、指针与结构体
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
...
…...
短整型变量a
短整型变量b
指针pointer_1 指针pointer_2
指针p1 指针p2
百度文库
短整型p
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例交换两变量的值
void swap(short *p1, short *p2) { short p; p=*p1; *p1=*p2; *p2=p; 地址传递 } main() { short a,b; short *pointer_1 =&a; short *pointer_2 =&b; scanf("%hd%hd",&a,&b); if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); } 运行结果:9,5
Neusoft Institute of Information
练习
【练习1】输入3个整数,输出最大值,要求用指向变 量的指针求最大值。 【练习2】输入10个整数保存在数组中,自定义一无返 回值函数计算和,在主函数中输出和。函数原型: void Sum(int a[],int n,int *psum); 【练习3】输入8个整数,自定义函数找出其中最小值 和最大值,在主函数输出。 void MaxMin(int a[],int n,int *pmax,int *pmin); 作业:ftp://ftp.cs.nsu.edu.cn/王会/2013-2014第 二学期/作业/指针练习.doc
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
变量访问
变量有地址,也有指向该地址的指针变量。因此,变 量的访问也有两种方式 – 直接访问:按照变量的地址进行存取 – 间接访问:先访问变量的地址,得到变量的地址值 以后再去访问该变量
Date: 2014年5月5日星期一
Neusoft Institute of Information
指针
任课教师:王会
办公室:C7座201 办公室电话: EMAIL:wanghui@nsu.edu.cn 课件下载网址:ftp://cs.nsu.edu.cn/王会/13-14第二学期
IT Education & Training IT Education & Training
…...
2000
2001 2002 2003
i
k
2005 …...
IT Education & Training
变量是对程序中数据 存储空间的抽象
Date: 2014年5月5日星期一
Neusoft Institute of Information
指针的概念
• 变量的地址:变量对应存储单元的首地址; • 指针:即变量的地址; • 指针变量:专门存放地址的变量即指针变量。
IT Education & Training
…...
Date: 2014年5月5日星期一
Neusoft Institute of Information
例:利用指针进行输入输出
int a; int *p=&a; /*定义指针变量*/ scanf(“%d”,p); /*输入a的值*/ printf(“%d,%d”, *p, a);/*输出a的值*/
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例:交换两变量的值
void swap(short *p1, short *p2) { short p; p=*p1; *p1=*p2; 2000 *p2=p; 2002 } 2004 main() 2006 { short a,b; 2008 short *pointer_1 =&a; COPY 200A short *pointer_2 =&b; 200C scanf("%hd%hd",&a,&b); 200E if(a<b)swap(pointer_1,pointer_2); 2010 printf("\n%d,%d\n",a,b); } (main) 9 5 5 9 2000 2002 (swap) 2000 2002 5
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例1:如何给指针变量赋值?
方式一:初始化 int x=3; int *p=&x;
p
变量x 的地址
方式二:赋值语句
int x=3; int *p=NULL;(NULL表示一个空值) p=&x;
„...
101
教室号码 教室 IT Education & Training
教室有容 量
Date: 2014年5月5日星期一
Neusoft Institute of Information
认识指针
内存中每个存储单元都有一个编号-----地址 内存
0
程序中: short i; float k;
编译或函数调用时为其分配内存单元
3
*p
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
变量的访问方式
…... 2000 2001 2002 2003 2004 2005 2006 2000 变量i_pointer 指针变量 3 20 10
Date: 2014年5月5日星期一
Neusoft Institute of Information
– 指向结构体变量的指针 • 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p; • 使用结构体指针变量引用成员形式 struct student 存放结构体变量在内存的起始地址 p num { int num; (*结构体指针名 结构体指针名 结构体变量名 .成员名 struct->成员名 studentname stu1; 例 int).成员名 n; char name[20]; stu struct student sex *p=&stu1; int *p=&n; char sex; (*p).num=101 *p=10; 指向运算符 n=10 stu1.num=101; age int age; }stu; 优先级: 1 结合方向:从左向右 struct student *p=&stu;
整型变量i
例
i=3;
-----直接访问
按变量地址存取 变量值
例
*i_pointer=20;
-----间接访问 通过存放变量地址的 变量去访问变量
i_pointer &(*i_pointer) i_pointer =&i &i = &(*i_pointer) i i = *i_pointer *(&i) *i_pointer = *(&i)
变量x
&x
3
p
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例:观察指针变量的引用。
void main() { int x=3; int *p=&x; printf("变量值:x=%d,p=%d\n",x,p); printf(“变量地址:x=%x,p=%x\n”,&x,p); /*%x控制输出16进制*/ printf("间接访问变量值:*p=%d\n",*p); }
变量有三要素:变量名、变量值、变量地址。
通过变量名,可以访问变量值,如果想访问该 变量的地址呢?
变量的地址存放在哪里?
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
1、内存地址──内存中存储单元的编号 教学楼
71
Date: 2014年5月5日星期一
函数参数为指针
Neusoft Institute of Information
2.如下程序的输出结果() void fun(int *x,int *y) { int *k; k=x;x=y;y=k;//*k=*x;*x=*y;*y=*k } main() { int a=3,b=6,*x=&a,*y=&b; fun(x,y); printf(“%d %d”,a,b); } A) 6 3 B) 3 6 C) 编译错
Date: 2014年5月5日星期一
Neusoft Institute of Information
授课要点
• 指针与指针变量 • 通过指针访问变量
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
问题1
IT Education & Training 2000 2002 2004 2006
2008
200A 200C 200E 2010
(main) 9 5 5 9 2000 2002
…...
短整型变量a 短整型变量b
指针pointer_1 指针pointer_2
...
Date: 2014年5月5日星期一
2000
指针变量
指针变量 变量地址(指针) 指向 变量 变量值
IT Education & Training
…...
地址存入 指针变量
Date: 2014年5月5日星期一
Neusoft Institute of Information
指针变量的定义
• 类型说明符 *变量名; – 例如:int *p1; • 对指针变量的定义包括三个内容: – (1)指针类型说明(*),即定义变量为一个指针 变量; – (2)指针变量名(p1); – (3)变量值(指针)所指向的变量的数据类型 (int)。
Neusoft Institute of Information
1.以下程序输出结果是________. #include <stdio.h> int ast(int x,int y,int *cp,int *dp) { *cp=x+y; *dp=x-y; } void main() {int a,b,c,d; a=4;b=3; ast(a,b,&c,&d); printf(“%d %d\n”,c,d); IT Education & Training }
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
讨论并总结
• • • • 指针定义后为什么必须要赋值才能使用 为什么指向变量的指针必须同变量的类型一致 int *p;与*p=10中的*有什么区别 使用指针的意义
IT Education & Training
B
D)0 0
Date: 2014年5月5日星期一
函数的类型为指针
Neusoft Institute of Information
int * add(int x,int y) { int z; z=x+y; return (&z); } void main() { int a=3,b=4; int *p; p=add(a,b); printf(“%d”,*p); } IT Education & Training
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
&和*运算符
• &和*运算符 – *——指针运算符(间接访问运算符),取指针所指向的 变量的内容 – &——取地址运算符,取变量的地址
p 2000 变量x x &x x=3 *p p *p=3
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
变量地址与指针
指针 …...
2000
短整型变量i
变量的地址
2001 2002 2003 2004 2005 2006
10
变量的内容
变量i_pointer
存储地址
内存
存储 单元
0 „... 2000 2001 „... 50
601 501
602 502
2002 注意:内存单元的地址与内存单元中的数 401 402 据是两个完全不同的概念。 2003 存储单元有
302 2004
存储2005 数据 大小(字节单 元、字单元)
301 201
202
102
„...
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
授课要点
函数参数、函数类型为指针类型 指针和结构体 动态分配内存
IT Education & Training
Date: 2014年5月5日星期一
函数参数为指针
…...
短整型变量a
短整型变量b
指针pointer_1 指针pointer_2
指针p1 指针p2
百度文库
短整型p
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例交换两变量的值
void swap(short *p1, short *p2) { short p; p=*p1; *p1=*p2; *p2=p; 地址传递 } main() { short a,b; short *pointer_1 =&a; short *pointer_2 =&b; scanf("%hd%hd",&a,&b); if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); } 运行结果:9,5
Neusoft Institute of Information
练习
【练习1】输入3个整数,输出最大值,要求用指向变 量的指针求最大值。 【练习2】输入10个整数保存在数组中,自定义一无返 回值函数计算和,在主函数中输出和。函数原型: void Sum(int a[],int n,int *psum); 【练习3】输入8个整数,自定义函数找出其中最小值 和最大值,在主函数输出。 void MaxMin(int a[],int n,int *pmax,int *pmin); 作业:ftp://ftp.cs.nsu.edu.cn/王会/2013-2014第 二学期/作业/指针练习.doc
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
变量访问
变量有地址,也有指向该地址的指针变量。因此,变 量的访问也有两种方式 – 直接访问:按照变量的地址进行存取 – 间接访问:先访问变量的地址,得到变量的地址值 以后再去访问该变量
Date: 2014年5月5日星期一
Neusoft Institute of Information
指针
任课教师:王会
办公室:C7座201 办公室电话: EMAIL:wanghui@nsu.edu.cn 课件下载网址:ftp://cs.nsu.edu.cn/王会/13-14第二学期
IT Education & Training IT Education & Training
…...
2000
2001 2002 2003
i
k
2005 …...
IT Education & Training
变量是对程序中数据 存储空间的抽象
Date: 2014年5月5日星期一
Neusoft Institute of Information
指针的概念
• 变量的地址:变量对应存储单元的首地址; • 指针:即变量的地址; • 指针变量:专门存放地址的变量即指针变量。
IT Education & Training
…...
Date: 2014年5月5日星期一
Neusoft Institute of Information
例:利用指针进行输入输出
int a; int *p=&a; /*定义指针变量*/ scanf(“%d”,p); /*输入a的值*/ printf(“%d,%d”, *p, a);/*输出a的值*/
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例:交换两变量的值
void swap(short *p1, short *p2) { short p; p=*p1; *p1=*p2; 2000 *p2=p; 2002 } 2004 main() 2006 { short a,b; 2008 short *pointer_1 =&a; COPY 200A short *pointer_2 =&b; 200C scanf("%hd%hd",&a,&b); 200E if(a<b)swap(pointer_1,pointer_2); 2010 printf("\n%d,%d\n",a,b); } (main) 9 5 5 9 2000 2002 (swap) 2000 2002 5
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例1:如何给指针变量赋值?
方式一:初始化 int x=3; int *p=&x;
p
变量x 的地址
方式二:赋值语句
int x=3; int *p=NULL;(NULL表示一个空值) p=&x;
„...
101
教室号码 教室 IT Education & Training
教室有容 量
Date: 2014年5月5日星期一
Neusoft Institute of Information
认识指针
内存中每个存储单元都有一个编号-----地址 内存
0
程序中: short i; float k;
编译或函数调用时为其分配内存单元
3
*p
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
变量的访问方式
…... 2000 2001 2002 2003 2004 2005 2006 2000 变量i_pointer 指针变量 3 20 10
Date: 2014年5月5日星期一
Neusoft Institute of Information
– 指向结构体变量的指针 • 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p; • 使用结构体指针变量引用成员形式 struct student 存放结构体变量在内存的起始地址 p num { int num; (*结构体指针名 结构体指针名 结构体变量名 .成员名 struct->成员名 studentname stu1; 例 int).成员名 n; char name[20]; stu struct student sex *p=&stu1; int *p=&n; char sex; (*p).num=101 *p=10; 指向运算符 n=10 stu1.num=101; age int age; }stu; 优先级: 1 结合方向:从左向右 struct student *p=&stu;
整型变量i
例
i=3;
-----直接访问
按变量地址存取 变量值
例
*i_pointer=20;
-----间接访问 通过存放变量地址的 变量去访问变量
i_pointer &(*i_pointer) i_pointer =&i &i = &(*i_pointer) i i = *i_pointer *(&i) *i_pointer = *(&i)
变量x
&x
3
p
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
例:观察指针变量的引用。
void main() { int x=3; int *p=&x; printf("变量值:x=%d,p=%d\n",x,p); printf(“变量地址:x=%x,p=%x\n”,&x,p); /*%x控制输出16进制*/ printf("间接访问变量值:*p=%d\n",*p); }
变量有三要素:变量名、变量值、变量地址。
通过变量名,可以访问变量值,如果想访问该 变量的地址呢?
变量的地址存放在哪里?
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
1、内存地址──内存中存储单元的编号 教学楼
71
Date: 2014年5月5日星期一
函数参数为指针
Neusoft Institute of Information
2.如下程序的输出结果() void fun(int *x,int *y) { int *k; k=x;x=y;y=k;//*k=*x;*x=*y;*y=*k } main() { int a=3,b=6,*x=&a,*y=&b; fun(x,y); printf(“%d %d”,a,b); } A) 6 3 B) 3 6 C) 编译错
Date: 2014年5月5日星期一
Neusoft Institute of Information
授课要点
• 指针与指针变量 • 通过指针访问变量
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
问题1
IT Education & Training 2000 2002 2004 2006
2008
200A 200C 200E 2010
(main) 9 5 5 9 2000 2002
…...
短整型变量a 短整型变量b
指针pointer_1 指针pointer_2
...
Date: 2014年5月5日星期一
2000
指针变量
指针变量 变量地址(指针) 指向 变量 变量值
IT Education & Training
…...
地址存入 指针变量
Date: 2014年5月5日星期一
Neusoft Institute of Information
指针变量的定义
• 类型说明符 *变量名; – 例如:int *p1; • 对指针变量的定义包括三个内容: – (1)指针类型说明(*),即定义变量为一个指针 变量; – (2)指针变量名(p1); – (3)变量值(指针)所指向的变量的数据类型 (int)。
Neusoft Institute of Information
1.以下程序输出结果是________. #include <stdio.h> int ast(int x,int y,int *cp,int *dp) { *cp=x+y; *dp=x-y; } void main() {int a,b,c,d; a=4;b=3; ast(a,b,&c,&d); printf(“%d %d\n”,c,d); IT Education & Training }
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
讨论并总结
• • • • 指针定义后为什么必须要赋值才能使用 为什么指向变量的指针必须同变量的类型一致 int *p;与*p=10中的*有什么区别 使用指针的意义
IT Education & Training
B
D)0 0
Date: 2014年5月5日星期一
函数的类型为指针
Neusoft Institute of Information
int * add(int x,int y) { int z; z=x+y; return (&z); } void main() { int a=3,b=4; int *p; p=add(a,b); printf(“%d”,*p); } IT Education & Training
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
&和*运算符
• &和*运算符 – *——指针运算符(间接访问运算符),取指针所指向的 变量的内容 – &——取地址运算符,取变量的地址
p 2000 变量x x &x x=3 *p p *p=3
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
变量地址与指针
指针 …...
2000
短整型变量i
变量的地址
2001 2002 2003 2004 2005 2006
10
变量的内容
变量i_pointer
存储地址
内存
存储 单元
0 „... 2000 2001 „... 50
601 501
602 502
2002 注意:内存单元的地址与内存单元中的数 401 402 据是两个完全不同的概念。 2003 存储单元有
302 2004
存储2005 数据 大小(字节单 元、字单元)
301 201
202
102
„...
IT Education & Training
Date: 2014年5月5日星期一
Neusoft Institute of Information
授课要点
函数参数、函数类型为指针类型 指针和结构体 动态分配内存
IT Education & Training
Date: 2014年5月5日星期一
函数参数为指针