1 / 17

密室 1

指针. 密室 3. 密室 2. 密室 1. 密室 1 钥匙箱. 密室 2 钥匙箱. C 语言数据类型. 整型 int 基本数据类型 浮点型 float double 字符型 char 数组 以 [ ] 为标志 结构 struct 构造类型 复杂数据类型 联合 union 枚举 enum 指针类型 以 * 为标志. C 语言的数据类型. 也叫实型. 主要内容. 掌握指针概念。 掌握指针与变量、数组、字符串的关系及应用。 理解指针函数、函数指针变量 .

leora
Télécharger la présentation

密室 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 指针

  2. 密室3 密室2 密室1 密室1钥匙箱 密室2钥匙箱

  3. C语言数据类型 整型 int 基本数据类型 浮点型 float double 字符型 char 数组以[ ]为标志 结构struct 构造类型 复杂数据类型联合union 枚举enum 指针类型以 * 为标志 C 语言的数据类型 也叫实型

  4. 主要内容 • 掌握指针概念。 • 掌握指针与变量、数组、字符串的关系及应用。 • 理解指针函数、函数指针变量. • 理解指向指针的指针 • main函数的参数与动态存储分配

  5. 内存 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地址分别是多少?

  6. 直接访问与间接访问 地址 程序中: int i,j,k; i= 3; j=6; k=i+j; 变量i的地址2000 3 变量j的地址2004 6 变量k的地址2008 9 变量名在赋值号“=”两边的意义: 1、若变量名在“=”左边,表示变量所 占的内存空间; 2、若变量名在“=”右边表示变量值 ,即变量空间中的内容。 图7—2直接访问

  7. 直接访问与间接访问 程序中: int i; int *i_pointer; i_pointer=&i; * i_pointer=3; 地址 变量i的地址2000 3 变量i_pointer的地址2100 2000 图7—3间接访问

  8. 指针与指针变量 程序中: int i; int *i_pointer; i_pointer=&i; * i_pointer=3; 地址 变量i的地址2000 3 变量i_pointer的地址2100 2000 指针:地址形象地称为“指针”,变量的地址称为“变量指针” 指针变量:专门用来存入另一个变量的地址(指针)的变量,称为“指针变量”。

  9. 指针变量 • 指针变量定义 • 定义指针变量的一般形式为: 类型 *变量名; 对指针变量的类型定义包括三个内容: (1)指针变量名; (2)指针类型说明,即定义变量为一个指针变量; (3)变量值(指针)所指向的变量的数据类型。 int *p1;/*定义p1为指向int型变量的指针变量*/ float *p2;/*定义p2为指向float型变量的指针变量*/ char *p2;/*定义p3为指向char型变量的指针变量*/

  10. 例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型指针

  11. *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---指针变量占用内存的地址

  12. 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

  13. 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

  14. 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

  15. 函数参数传递 • 参数传递分为传值与传地址两种方式。 • 传值方式:将对应表达式的值复制一份传给相应的实参,实参与形参占有不同的存储单元,形参的改变不会影响实参。 • 传地址方式:将实参的地址传递给形参,实参与形参共享存储单元,这时形参的改变引起实参的改变。一般用指针与数组完成,用以带回多个值。

  16. 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); } • 值传递:实参传递数据给形参,单向传递

  17. 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);

More Related