170 likes | 349 Views
指针. 密室 3. 密室 2. 密室 1. 密室 1 钥匙箱. 密室 2 钥匙箱. C 语言数据类型. 整型 int 基本数据类型 浮点型 float double 字符型 char 数组 以 [ ] 为标志 结构 struct 构造类型 复杂数据类型 联合 union 枚举 enum 指针类型 以 * 为标志. C 语言的数据类型. 也叫实型. 主要内容. 掌握指针概念。 掌握指针与变量、数组、字符串的关系及应用。 理解指针函数、函数指针变量 .
E N D
密室3 密室2 密室1 密室1钥匙箱 密室2钥匙箱
C语言数据类型 整型 int 基本数据类型 浮点型 float double 字符型 char 数组以[ ]为标志 结构struct 构造类型 复杂数据类型联合union 枚举enum 指针类型以 * 为标志 C 语言的数据类型 也叫实型
主要内容 • 掌握指针概念。 • 掌握指针与变量、数组、字符串的关系及应用。 • 理解指针函数、函数指针变量. • 理解指向指针的指针 • main函数的参数与动态存储分配
内存 0 …... 2000 2001 2002 2003 2004 2008 2012 …... 地址与变量地址 地址:存储器中一个字节为一个存储单元,每个单元有一个固定的编号,称为“地址” 变量地址:变量所占存储单元首字节的地址,称为“变量地址” 3 变量值:变量所占单元中的数据,称为“变量值” 6 程序中: int i,j,k; i= 3; j=6; k=i+j; 9 变量i,j,k地址分别是多少?
直接访问与间接访问 地址 程序中: int i,j,k; i= 3; j=6; k=i+j; 变量i的地址2000 3 变量j的地址2004 6 变量k的地址2008 9 变量名在赋值号“=”两边的意义: 1、若变量名在“=”左边,表示变量所 占的内存空间; 2、若变量名在“=”右边表示变量值 ,即变量空间中的内容。 图7—2直接访问
直接访问与间接访问 程序中: int i; int *i_pointer; i_pointer=&i; * i_pointer=3; 地址 变量i的地址2000 3 变量i_pointer的地址2100 2000 图7—3间接访问
指针与指针变量 程序中: int i; int *i_pointer; i_pointer=&i; * i_pointer=3; 地址 变量i的地址2000 3 变量i_pointer的地址2100 2000 指针:地址形象地称为“指针”,变量的地址称为“变量指针” 指针变量:专门用来存入另一个变量的地址(指针)的变量,称为“指针变量”。
指针变量 • 指针变量定义 • 定义指针变量的一般形式为: 类型 *变量名; 对指针变量的类型定义包括三个内容: (1)指针变量名; (2)指针类型说明,即定义变量为一个指针变量; (3)变量值(指针)所指向的变量的数据类型。 int *p1;/*定义p1为指向int型变量的指针变量*/ float *p2;/*定义p2为指向float型变量的指针变量*/ char *p2;/*定义p3为指向char型变量的指针变量*/
例int *p=&a; int a; 指针变量的初始化 例 int a; int *p; p=&a; 例 int a; int *p=&a; 赋给指针变量, 不是赋给目标变量 取变量地址格式:&变量名; 一般形式:[存储类型]数据类型 *指针名=初始地址值; 变量必须已说明过 类型应一致 例 int a; int *p=&a; int *q=p; 用已初始化指针变量作初值 例main( ) { int a; static int *p=&a; .............. } () 不能用auto变量的地址 去初始化static型指针
*i_pointer i_pointer 10 2000 &i_pointer i …... 整型变量i 2000 10 变量i_pointer 2100 2000 指针变量 …... 指针变量的引用 含义: 取变量的地址,存储器地址 单目运算符 优先级: 14 结合性:自右向左 含义:取指针所指向变量的内容 单目运算符 优先级: 14 结合性:自右向左 • 两者关系:互为逆运算 • 理解 • &与*运算符 • 含义 i_pointer &i &(*i_pointer) i *i_pointer *(&i) i_pointer=&i=&(*i_pointer) i=*i_pointer =*(&i) int i=10; int*i_pointer=&i; i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址
letb *letb leta • 例子7-1指针赋值取内容操作应用 #include <stdio.h> void main() { char leta,*letb,letc; leta=‘x’; letb=&leta; letc=*letb; printf("(letc)=%c\n",letc); } x &leta x letc
a a 100 b b 10 例子7-2:指针运算符”&””*”的应用 *pointer_1 #include <stdio.h> main() { int a,b; int *pointer_1,*pointer_2, a=100; b=10; pointer_1=&a; pointer_2=&b; printf("%d,%d",a,b); printf("%d,%d",*pointer_1,*pointer_2); return; } pointer_1 pointer_2 *pointer_2
p1 a a 5 p2 p b b 9 例子7-3输入a和b两个整数,按先大后小顺序输出 #include <stdio.h> main() { int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a; p2=&b; if (a<b) { p=p1; p1=p2; p2=p; } printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); return; } &a &b &b &a
函数参数传递 • 参数传递分为传值与传地址两种方式。 • 传值方式:将对应表达式的值复制一份传给相应的实参,实参与形参占有不同的存储单元,形参的改变不会影响实参。 • 传地址方式:将实参的地址传递给形参,实参与形参共享存储单元,这时形参的改变引起实参的改变。一般用指针与数组完成,用以带回多个值。
p1 p1 a a p p 5 5 9 5 b b p2 p2 5 9 9 指针的应用:值传递与地址传递的区别 swap(int p1,int p2) { int p; p=p1 p1=p2; p2=p; } main() { int a,b; scanf("%d,%d",&a,&b); if(a<b)swap(a,b); printf("\n%d,%d\n",a,b); } • 值传递:实参传递数据给形参,单向传递
a a a 5 9 b b b 9 5 5 p p 指针的应用:值传递与地址传递的区别 swap(int *p1,int *p2) { int p; p=*p1 *p1=*p2; *p2=p; } main() { int a,b; int *pointer_a,*pointer_b; scanf("%d,%d",&a,&b); pointer_a=&a;pointer_b=&b; if(a<b)swap(pointer_a,pointer_b); printf("\n%d,%d\n",a,b); } *pointer_a • 指针传递:共享内存,“双向”传递 p1 pointer_a *p1 pointer_b *p2 p2 *pointer_b if(a<b)swap(&a,&b);