资源预览内容
第1页 / 共55页
第2页 / 共55页
第3页 / 共55页
第4页 / 共55页
第5页 / 共55页
第6页 / 共55页
第7页 / 共55页
第8页 / 共55页
第9页 / 共55页
第10页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
指针,指针,引入存储地址和直接访问计算机中程序、数据等所有信息都存放在相应的存储区域中任何存储区域的每个存储单元即字节,都有其编号,即存储地址变量名、数组名、函数名等标识符都直接对应其存储地址。通过变量名、数组或数组元素名、函数 名访问即直接访问。,指针的概念指针即其所指向的对象的储存地址指针可以指向某类型的变量、数组元素、数组、函数等通过指针访问其所指向的对象即间接访问,指针变量变量等数据的5个基本属性:地址(存储单元编号)值(存储内容)数据类型(存储、组织及操作方式)存储类别(动态、静态时间范围存储区域、生存期)作用域(局部、全局空间范围使用范围、作用域)直接访问和间接访问直接访问 通过变量、数组、函数名等标识的存储地址直接对其进行访问间接访问,指针变量指针变量存储所指对象(某类型数据、函数等)地址的变量指针声明定义语句的一般形式: 类型 *标识符 ;例 int i, *ip = &i, *p; i = 5; p = ip; *p = i*i;注意:在涉及指针的声明定义语句和可执行语句中*的不同含义。指针概念:存储地址、实现间接访问。,指针定义符,指针定义符,间接访问运算符,与指针相关的两个运算符:*指针定义符和间接访问运算符。 &取地址运算符;4.1.3 指针初始化和赋值在定义语句中初始化在执行语句中赋值,int i, *ip = &i, *p; / i = 5;p = ip; / *p = i*i;,若写成int i, *ip, *p; i = 5; *ip = &i; p = ip; / *p = i*i;,int i, *ip, *p; i = 5; ip = &i;/ p = ip; / *p = i*i;,空指针指针值为零,无指向。,指针的类型及其存储字节数指针的类型即其所指对象的类型。指针:存储所指对象(某基本或构造类型的数据、某函数等)的地址指针变量用于指向基类型变量或数组元素; 特殊指针用于指向数组、函数、结构体数据void类型指针主要用于动态内存分配若指针指向的对象是数组元素(或数组行),其1相当于指向下一个元素(或下一行)(5)指针本身所占存储字节数取决于C编译系统。p.90【例4-2】,指针变量用作函数形参,#includevoid swap( int *pa, int *pb ) int temp; temp=*pa; *pa=*pb; *pb=temp;int main() int a, b; printf(Please input a, bn); scanf(%d%d, &a, &b); swap(&a, &b); printf(%d, %d, a, b); return 0;,#includevoid swap(int x, int y) int temp; temp=x; x=y; y=temp;int main() int a, b; printf(Please input a, bn); scanf(%d%d, &a, &b); swap(a, b); printf(%d, %d, a, b); return 0;,形参为指针变量实参地址传递给形参形参指针间接访问实现数据共享,形参为普通变量实参数据值传递给形参形参变量直接访问无法实现数据共享,指针变量指向数组元素及指针运算指针变量即可指向变量也可指向数组元素 int a5, *p, *q; p=&a0; /等同p=a;指向数组元素的指针运算前提p=&ai 则p=j 即p=&aij; 前提p=&ai,q =&aj 则q-p 即j-i 但q+p无意义; 前提p=&ai,q =&aj则p和q可关系运算指向数组元素的指针带下标 前提p=&ai 则pj 即*(p+j) 即*(a+i+j) 即ai+j注意间接访问与自增、自减混合运算的优先级,#includeint main()int a5=1, 4, 7, 10, 13, *p=a, y;y=+*p; / y =+(*p) 即y =+a0printf(y=%dtp=%un, y, p);y=*+p; /y =* (+p)即y =a1printf(y=%dtp=%un, y, p);y=*p+; / y=*p和 p+;pritf(y=%dtp=%un, y, p);retrn 0; ./a.outy=2 p=3216435652y=4 p=3216435656y=4 p=3216435660,若有#define N 4 int aN, i, *p=a ; 则 :,引入指针后一维数组元素ai 的多种引用方式。例如:,例:#includeint main()int a5, i, *p=a;for(i=0; i5; i+)scanf(“%d”, &ai ); / (a+i)、(p+i)、&pi for(i=0; i5; i+)printf(“%dt”, ai ); / *(a+i)、*(p+i)、pi printf(“n);return 0;,一维数组元素ai 的多种引用方式 *(a+i) *(p+i) pi,数组和指向数组的指针作函数参数的对比例:有一个长度为n的数组, maxArray函数找其中的最大值。试比较以下4种方式:(1)实参和形参都为数组名#include int main() int a5; maxArray(a, 5);int maxArray( int b, int n ) int i, max;max=b0; for(i=1;imax) max=bi; return max; ,(2)实参和形参都为指针int main()int a5, *p=a;maxArray(p, 5);int maxArray( int *q, int n )int i, max;max= *q;for(i=1;imax max= *(q+i) ; return max; ,(4)实参为指针,形参为数组名int main()int a5, *p=a;maxArray(p, 5);int maxArray( int b, int n )int i, max; max=b0;for(i=1;imax) max=bi; return max; ,(3)实参为数组名,形参为指针int main()int a5;maxArray(a, 5);int maxArray( int *q, int n )int i, max;max= *q;for(i=1;imax max= *(q+i) ; return max; ,/排序#include stdio.hint main() int a5=1,4,7,3,5, i; printf(&a=%un, &a); printf(a=%un, a); printf(&a0=%un, &a0); printf(&a1=%un, &a1); for(i = 0; i5; i+) printf(%ut, ai); printf(n); sortArray(a, 5); for(i = 0; i5; i+) printf(%ut, ai); printf(n);,int sortArray( int b, int n ) int i, j, max, t; printf(&b=%un, &b); printf(b=%un, b); printf(*b=%un, *b); printf(&b0=%un, &b0); for(i=0; in-1; i+) max=i; for(j=i+1;jbmax) max=j; t = bmax; bmax = bi; bi = t; return 0;,形参数组共享实参数组数据存储,若形参为数组名:函数体内直接访问形参数组,若形参为指针:函数体内间接访问实参数组,数组或指向数组的指针变量作函数参数都是实参将数组地址传递给形参,都共享实参数组数据存储。但:,二维数组及指向一维数组的指针例:int a34, *p=a, (*q)4 =a;如何定义指向一维数组的指针?类型 (*指针变量名)元素个数;指针的类型和形式决定了指针值变化的基本单位。,p,p,p,p,p,p,p,p,p,p,p,p,q,q,q,二维数组的行名,若有#define M 3#define N 4 int aMN, i,j,*p=a, (*q)N =a; 则 :,二维维数组元素aij 的多种引用方式,例如:,/* Test aij */#include stdio.h#include conio.h#define M 3#define N 4int main() int aMN, i,j,*p=a, (*q)N =a; for(i=0; iM; i+) for(j=0; jN; j+)/ (ai+j)、(*(a+i)+j) )、&(*(a+i)j 、(p+i*N+j)、&pi*N+j、(qi+j )、&qij scanf(%d, &aij ); for(i=0; i3; i+) for(j=0; j4; j+)/ *(ai+j)、*(*(a+i)+j)、*(a+i)j 、*(p+i*N+j)、pi*N+j 、*(qi+j ) )、qij printf(%dt, aij ); printf(n); return 0;,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号