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