语言序设计 第十章指针 任课老师:台安
第十章 指针 任课老师:台安
第十章指针 10.1指针的概念 令10.2变量的指针和指向变量的指针变量 10.3数组的指针和指向数组的指针变量 10.4字符串的指针和指向字符串的指针变量 10.5函数的指针和指向函数的指针 令10.6返回指针值的函数 10.7指针数组和指向指针的指针 10.8指针数据小结 上一页下一页 返回
上一页 下一页 返回 第十章 指针 ❖ 10.1 指针的概念 ❖ 10.2 变量的指针和指向变量的指针变量 ❖ 10.3 数组的指针和指向数组的指针变量 ❖ 10.4 字符串的指针和指向字符串的指针变量 ❖ 10.5 函数的指针和指向函数的指针 ❖ 10.6 返回指针值的函数 ❖ 10.7 指针数组和指向指针的指针 ❖ 10.8 指针数据小结
§10.1指针的概念 令变量的两个概念: 对应的地址(内存单元) 对应的值(具体的数值) 变量的地址=变量的指针指向变量在内存中的 存储地址 两种访问变量a的方式: 令1直接访问.通过变量a找到棋对应的存储地址。 令2间接访问.把变量a的地址放到另一个变量b中,通过变 量b来访问变量a。变量b就称为指针变量。 令指针变量:存放变量的地址的变量 令指钍类型:指针所指对象的数据类型 上一页下一页 返回
上一页 下一页 返回 ❖ 变量的两个概念 : ❖ 对应的地址 (内存单元) ❖ 对应的值 (具体的数值) ❖ 变量的地址=变量的指针,指向变量在内存中的 存储地址。 ❖ 两种访问变量a的方式: ❖ 1 直接访问. 通过变量a找到棋对应的存储地址。 ❖ 2 间接访问. 把变量a的地址放到另一个变量b中,通过变 量b来访问变量a。变量b就称为指针变量。 ❖ 指针变量:存放变量的地址的变量 ❖ 指针类型:指针所指对象的数据类型. §10.1 指针的概念
例如: 定义指针变量 int i,j,k, *ip, jp, kp; 2000 i=3;j=6;k=ij; 2002 ip=&i; 给指针变量赋值 2004 k kp=&k * kp=*ip+ jp; 30102000 p 30122002 Jp 给指针变量所 30142004 p 指对象赋值 上一页下一页 返回
上一页 下一页 返回 例如: int i, j, k, *ip,*jp,*kp; i=3; j=6; k=i+j; ip=&i; jp=&j; kp=&k; *kp=*ip+*jp; 3 6 9 …. 2000 2002 2004 2000 2002 2004 3010 3012 3014 i j k ip jp kp 定义指针变量 给指针变量赋值 给指针变量所 指对象赋值
§102变量的指针和指向变量的指针变量 令变量的指针:就是变量的地址 如i所对应的内存地址是2000,则i的指针就 是2000 令指针变量:用来存放变量地址的变量。 nt 1=3 31002000 ☆int* 2000 ip=&i p p所对应的地址是3010,对应的内容是20002000就是i所对应的 地址,因此,j是存放变量i的地址的变量。若jp是存放变量i的 地址的指针变量,则*是指针变量ip所指的对象(即变量i) 上一页下一页 返回
上一页 下一页 返回 §10.2 变量的指针和指向变量的指针变量 ❖ 变量的指针:就是变量的地址。 如 i 所对应的内存地址是2000,则 i 的指针就 是2000; ❖ 指针变量:用来存放变量地址的变量。 ❖ int i=3; ❖ int *ip; ❖ ip = &i ❖ 2000 3 ip i 2000 *ip 3100 ip所对应的地址是3010,对应的内容是2000, 2000就是 i 所对应的 地址,因此,ip是存放变量 i 的地址的变量。 若ip 是存放变量i 的 地址的指针变量, 则 *ip是指针变量 ip所指的对象(即变量 i )
1021指针变量的定义 令指针变量在使用前必须先定乂,且赋值, 以便使其指向特定类型的变量 指针变量的定义形式 类型标识符*标识符 其中类型标识符:指出指向何种数据类型的 变量 标识符:表示指针变量名 上一页下一页 返回
上一页 下一页 返回 10.2.1指针变量的定义 ❖ 指针变量在使用前必须先定义,且赋值, 以便使其指向特定类型的变量。 ❖ 指针变量的定义形式: ❖ 类型标识符 * 标识符 ❖ 其中:类型标识符:指出指向何种数据类型的 变量 ❖ 标识符:表示指针变量名
例如: nt 说明 nt *pl, * p2 In 1定义时指针变量名前必须 l=&i;p2=& 以‘*’开头,指出该变量 是 pl=8;*p2=12 指针变量 float *p3 2.引用时,指针变量前加 char* p4; *’表示指针变量所指 向的 对象(即变量 (注意两者的区别) 3指针变量一经定义就只可 指向类型的变里。 如县能指向啦变
上一页 下一页 返回 例如: int i, j; int *p1, *p2; p1=&i; p2=&j; i=3; j=5; *p1=8; *p2=12; float * p3; char * p4; 说明: 1.定义时指针变量名前必须 以‘ *’开头,指出该变量 是 指针变量。 2.引用 时 ,指针变量前加 ‘ * ’ 表示指针变量所指 向的 对象(即变量 ) (注意两者的区别)。 3.指针变量一经定义就只可 指向同类型的变量。 如:p3只能指向实型变量
10,22指针变量的引用 令通常,是将变量的地址赋给指针变量,但在 Turbo c中,整型数据(十进制、十六进制、八进制) 也可赋给指针变量, 如:int*pl pl=100; printf( %od\ n”,*p1) 令指针变量有两种运算符: 令&:取地址运算符 如:pl=&i 令*:取所指变量运算符。或者访问目标的运算符 如:*p1,它与i等价 上一页下一页 返回
上一页 下一页 返回 10.2.2 指针变量的引用 ❖ 通常,是将变量的地址赋给指针变量,但在Turbo c中,整型数据(十进制、十六进制、八进制) 也可赋给指针变量, ❖ 如: int *p1; ❖ p1=100; ❖ printf(“%d\ n”,* p1); ❖ 指针变量有两种运算符: ❖ &:取地址运算符. ❖ 如:p1=&i; ❖ * :取所指变量运算符。或者访问目标的运算符 ❖ 如:* p1, 它与i 等价
10,22指针变量的引用 编译时,系统将内存单元分配给变量后,程序执行时对 变量的操作实际上就是根据变量名査找与之对应的变 量的地址,然后对地址中的数据进行操作。 1.直接访问 k 冷2.间接访问*kp=*ip+*jp 令这里:ip,jp,kp:就称为指针变量,其值是另一个变量所对 应的内存地址。 上一页下一页 返回
上一页 下一页 返回 10.2.2 指针变量的引用 ❖ 编译时,系统将内存单元分配给变量后, 程序执行时对 变量的操作实际上就是根据变量名查找与之对应的变 量的地址,然后对地址中的数据进行操作。 ❖ 1.直接访问 ❖ k = i + j ❖ 2.间接访问 * kp = * ip + *jp ❖ 这里:i p, j p, k p:就称为指针变量,其值是另一个变量所对 应的内存地址
例:指针变量操作简例 令main() a=100,b=10 int a, b, pl, *p2 pl=100,*p2=10 令a=100:b=10 &a=fff&b=fff2 pI=&a; p2=&b; pl=fff, p2=fff2 &pl=fff0, &p2=ffee printf( a=%d, b=%od\ n a, b); printf(*p1=%d, * p2=%d n,,*pl, * p2) printf(" &a=%x, b=%,, &a, &b) printf( pl=%x, p2=%xn,, pl, p2); 令 printf((“&pl=%X,&p2=%X\n”,&pl,&p2) 上一页下一页 返回
上一页 下一页 返回 例: 指针变量操作简例 ❖ main( ) ❖ { int a, b, *p1, *p2 ; ❖ a=100; b=10; ❖ p1=&a; p2=&b; ❖ printf(“a=%d, b=%d\ n”,a, b); ❖ printf(“* p1=%d, * p2=%d\ n”, *p1, * p2); ❖ printf(“&a=%x,& b=%x\ n”,&a, &b); ❖ printf(“p1=%x, p2=%x\ n”, p1, p2); ❖ printf(“& p1=%x, &p2=%x\ n”, &p1, & p2); ❖ } a=100,b=10 *p1=100,*p2=10 &a=fff4,&b=fff2 p1=fff4,p2=fff2 &p1=fff0,&p2=ffee