- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行结果:9,9
(main)
9 5 9 9 2000 2002
(swap)
2000 2002 ****
...
指针变量在使用前 必须赋值!
…...
整型变量a 整型变量b 指针pointer_1 指针pointer_2 指针p1 指针p2 指针p
假设2000
例 将数从大到小输出
…...
/*ch9_32.c*/ swap(int x,int y) { int t; t=x; x=y; y=t; 值传递 } main() COPY { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b) swap(*pointer_1,*pointer_2); printf("\n%d,%d\n",a,b); }
危险!
…...
2000 2001 2002 2003 2004 2005 2006 …... 随机
整型变量i
10
指针变量p
例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); }
零指针与空类型指针
零指针:(空指针)
定义:指针变量值为零 表示: int * p=0;
地址存入 指针变量
&与*运算符
含义 含义: 取变量的地址 含义: 取指针所指向变量的内容 两者关系:互为逆运算 单目运算符 单目运算符 i_pointer 优先级: 理解 2 优先级: 2 &i_pointer 2000
结合性:自右向左 结合性:自右向左 …... 2000 2001 2002 *i_pointer 10 i
指针变量的初始化
一般形式:[存储类型] 数据类型 *指针名=初始地址值; 例 int i; int *p=&i; 赋给指针变量, 不是赋给目标变量 变量必须与已说明过的 类型应一致
例
例 int i; int *p=&i; int *p=&i; int i; int *q=p;
用已初始化指针变量作初值
main() { int a; int *pa=&a; a=10; printf("a:%d\n",a); printf("*pa:%d\n",*pa); printf("&a:%x(hex)\n",&a); printf("pa:%x(hex)\n",pa); printf("&pa:%x(hex)\n",&pa); }
(main)
…...
5 9
变量a 变量b
} main() { int a,b; scanf("%d,%d",&a,&b); if(a<b) swap(a,b); printf("\n%d,%d\n",a,b); 运行结果:5, 9 }
200A
…...
例 将数从大到小输出 swap(int *p1, int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } main() COPY { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
(main) …...
5 9
(swap)
变量a 变量b 变量x
5 9 5 9 5
…...
变量y
变量temp
指针变量作为函数参数——地址传递
特点:共享内存,“双向”传递 例 将数从大到小输出 swap(int x,int y) 2000 { int temp; 2002 temp=x; 2004 x=y; 2006 y=temp; 2008 值传递
例 main( ) { int i; static int *p=&i; ..............
}
( )
不能用auto变量的地址 去初始化static型指针
指针变量必须先赋值,再使用 例 main( ) { int i=10; int *p; *p=i; printf(“%d”,*p); }
i k
2005
…...
变量是对程序中数据 存储空间的抽象
指针与指针变量
指针:一个变量的地址 指针变量:专门存放变量地址的变量叫~
指针 2000 …... 整型变量i
变量的地址
2001
10
变量的内容
2002
2003 2004 2005 2000 2006 指针变量 变量地址(指针) 指向 变量 变量值 …... 变量i_pointer 指针变量
2000 变量i 3 *i_pointer
i &i
i=3;
*i_pointer i_pointer
*i_pointer=3
指针变量的定义
一般形式: [存储类型] 例 数据类型 *指针名; int *p1,*p2; 表示定义指针变量 float *q ; 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 不是‘*’运算符 static char *name; 注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较
void *类型指针
表示: void *p; 使用时要进行强制类型转换
表示不指定p是指向哪一种 类型数据的指针变量
例 指针的概念 …... 运行结果: a:10 *pa:10 &a:f86(hex) pa:f86(hex) &pa:f88(hex)
f86 f87 f88 f89 f8a f8b f8c …... f86
整型变量a 指针变量pa
10
例 输入两个数,并使其从大到小输出
main() { int *p1,*p2,*p,a,b; 2000 scanf("%d,%d",&a,&b); 2002 p1=&a; p2=&b; 2004 if(a<b) 2006 { p=p1; p1=p2; p2=p;} 2008 printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); }
运行结果:5,9 (main) …... ...
5 9 2000 2002
运行结果:5,9
(main)
2000 2002
2004 2006 2008 200A 200C 200E 2010
5 9 2000 2002
(swap)
整型a 整型b pointer_1
pointer_2
整型x 整型b 整型t
9 5 9 5 5
...
例 将数从大到小输出 swap(int *p1, int *p2) { int *p; 2000 p=p1; 2002 p1=p2; p2=p; 2004 地址传递 } 2006 main() 2008 COPY { int a,b; 200A int *pointer_1,*pointer_2; 200C scanf("%d,%d",&a,&b); 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b) swap(pointer_1,pointer_2); printf("%d,%d",*pointer_1,*pointer_2); }
第十章 指针
C程序设计中使用指针可以:使程序简洁、紧 凑、高效
有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值
§10.1 指针的概念
变量与地址
内存中每个字节有一个编号-----地址 内存 0
程序中: int i;
float k;
编译或函数调用时为其分配内存单元
…...
2000 2001 2002 2003
直接访问与间接访问
直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量
…...
例
整型变量i
i=3;
-----直接访问
2000 2001 2002 2003 2004 3 20 10
变量i_pointer
2000
2005
2006
指针变量
例
*i_pointer=20;
Байду номын сангаас
-----间接访问
p指向地址为0的单元, 系统保证该单元不作它用 表示指针变量值没有意义 例 例 char *p1; int *p; ...... void *p2; while(p!=NULL) p1=(char *)p2; { ...… p2=(void *)p1; }
#define NULL 0 int *p=NULL:
运行结果:9,5 (main) 2000 2002 2004 …...
2006 2008
200A 200C 200E 2010