第十章指针 ●地址和指针的概念 变量的指针和指向变量的指针变量 ●数组的指针和指向数组的指针变量 字符串的指针和指向字符串的指针变量 ●函数的指针和指向函数的指针变量 返回指针值的函数 ●指针数组和指向指针的指针 ●有关指针的数据类型和指针运算的小结
第十章 指针 ⚫ 地址和指针的概念 ⚫ 变量的指针和指向变量的指针变量 ⚫ 数组的指针和指向数组的指针变量 ⚫ 字符串的指针和指向字符串的指针变量 ⚫ 函数的指针和指向函数的指针变量 ⚫ 返回指针值的函数 ⚫ 指针数组和指向指针的指针 ⚫ 有关指针的数据类型和指针运算的小结
指针是C语言最有特点的内容之一, 使用指针的作用: 有效地表示复杂的数据结构 动态分配内存 方便地使用字符串 有效而方便的使用数组 直接处理内存地址 在调用函数时得到多于一个的值
⚫ 指针是C语言最有特点的内容之一, 使用指针的作用: • 有效地表示复杂的数据结构 • 动态分配内存 • 方便地使用字符串 • 有效而方便的使用数组 • 直接处理内存地址 • 在调用函数时得到多于一个的值
地址和指针的概 数据在内存中的存储和读取一地址的概念 2000 3x 变量X是符号地址 数据访问的两种方式 直接访问:按变量地址存取变量 2.间接访问:先取到变量地址,再按地址存取 变量 变量的地址称为该变量的指针 用来存放变量地址的变量称为指针变量
地址和指针的概念 ⚫ 数据在内存中的存储和读取—地址的概念 ⚫ 数据访问的两种方式 1. 直接访问:按变量地址存取变量 2. 间接访问:先取到变量地址,再按地址存取 变量 ⚫ 变量的地址称为该变量的指针 用来存放变量地址的变量称为指针变量 3 x 2000 变量x是符号地址
变量的指针和指向变量的 指针变量 ●指针变量的定义 ●指针变量的引用 ●指针变量作函数的参数
变量的指针和指向变量的 指针变量 ⚫ 指针变量的定义 ⚫ 指针变量的引用 ⚫ 指针变量作函数的参数
指针变量的定义 变量的指针即变量的地址,存放变量 的变量是指针变量,用“*”表示指向 ●指针变量的定义形式 基类型*指针变量名 例:int*p; float *pl,p. ●用赋值语句使一个指针变量指向一个特定 类型的变量
指针变量的定义 ⚫ 变量的指针即变量的地址,存放变量地址 的变量是指针变量,用“*”表示指向 ⚫ 指针变量的定义形式 基类型 *指针变量名 例:int *p; float *p1,*p2; ⚫ 用赋值语句使一个指针变量指向一个特定 类型的变量
i_pointer 定义 2000 int i, *i pointer, PoiNter int j, * j_pointer 2100 pointer 赋值 2000 2000 i_pointer=&i J_pointer 2100 pointer=&ji 2100
定义 int i,*i_pointer; int j,*j_pointer; 赋值 i_pointer=&i; j_pointer=&j; i_pointer i 2000 2000 j_pointer j 2100 2100 i_pointer i 2000 j_pointer j 2100
指针变量的引用 指针变量中只能存放地址 两个有关的运算符 1.&:取地址运算符 2.*:指针运算符(间接访问运算符) 两运算符优先级别相同,右结合性 指针变量定义以后,要在程序中规定 其指向哪个变量见例1和例2
指针变量的引用 ⚫ 指针变量中只能存放地址 ⚫ 两个有关的运算符 1. & :取地址运算符 2. * :指针运算符(间接访问运算符) 两运算符优先级别相同,右结合性 ⚫ 指针变量定义以后,要在程序中规定 其指向哪个变量见例1和例2
例 #include maino i int i,j; int *i_pointer, *j_pointer; float x,y;foatφp,q; printf("Enter two integers i,j: In") scanf("%d, %d", &i, &j) pointer=&i; j_pointer=& printf("Enter two real numbers x,y: In") scanf("%f, %f", &x, &y); p=&x;q=&y; printf("ni=%,j=%Ⅶn", i pointer,扛 pointer); printf("i-address=%X, j-address=%XIn", _pointer,jpointer) printf("X=%., y=%.2fin",*p, *a: printf(" x-address=%X, y-address=%XIn",p, q): y
例#include 1 指针变量的使用。 main() { int i,j; int *i_pointer,*j_pointer; float x,y; float *p,*q; printf("Enter two integers i,j:\n"); scanf("%d,%d",&i,&j); i_pointer=&i; j_pointer=&j; printf("Enter two real numbers x,y:\n"); scanf("%f,%f",&x,&y); p=&x; q=&y; printf("\ni=%d, j=%d\n",*i_pointer,*j_pointer); printf("i-address=%X, j-address=%X\n",i_pointer,j_pointer); printf("x=%.2f, y=%.2f\n",*p,*q); printf("x-address=%X, y-address=%X\n",p,q); }
例2输 include <stdio. h: 倾序输出 maino fint a, b, p, p1, *p2 printf(" Enter two integers: In") scanf("%d, %d", &a, &b) p1=&a;p2=&b; if(asb) {p=p1;p1=p2;p2=p;} printf( na=%d, b=%d\n", a, b) printf(" bigger=%d, smaller=%dn,*p1, *p2)
例2 输入#include a 和 b 两个整数,按从大到小的顺序输出 main() { int a,b,*p,*p1,*p2; printf("Enter two integers:\n"); scanf("%d,%d",&a,&b); p1=&a; p2=&b; if(a<b) { p=p1; p1=p2; p2=p; } printf("\na=%d, b=%d\n",a,b); printf("bigger=%d, smaller=%d\n",*p1,*p2); }
指针变量作函数的参数 将一个变量的地址传送到另一个函数中 ●在函数执行过程中,使指针变量所指向 的变量值发生变化,函数调用结束后, 变量值的变化依然保留下来,见例3 ●也可通过函数调用得到n个变化的值
指针变量作函数的参数 ⚫ 将一个变量的地址传送到另一个函数中 ⚫ 在函数执行过程中,使指针变量所指向 的变量值发生变化,函数调用结束后, 变量值的变化依然保留下来,见例3 ⚫ 也可通过函数调用得到n个变化的值