指针变量作为函数参数不能企图通过改变指针形参的值而使指针实参的值改变(例8.4)对输入的两个整数按大小顺序输出#include<stdio.h>printf("max=%d.min=%d\n",*pointer_1,*pointer_2):int mainoreturn 0;void swap(int*p1,int *p2):int a,b:int*pointer_1.*pointer_2://pointer_1.pointer2是int*型变量void swap(int *p1,int *p2)//形参是指针变量int*p:printf("pleaseentertwointegernumbers:"):p=p1;scanf("%d,%d",&a,&b)://下面3行交换p1和p2的指向p1=p2;pointer_1=&a;C:IWINDOWS)system32)cmd.exe口Xpointer2=&bp2=p:leaseentertwointegernumbers:5,gif(a<b)swap(pointer1.pointer2)in=g//调用swap函数,用指针变量作实参请按在意键继续p1p1aaaapointer_1pointer_15555&a&a&b&abbbbp2p2pointer_2pointer_29999&b&b&a&b→
指针变量作为函数参数 【例8.4】对输入的两个整数按大小顺序输出。 #include <stdio.h> int main() { void swap(int *p1,int *p2); int a,b; int *pointer_1,*pointer_2; //pointer_1,pointer_2是int *型变量 printf("please enter two integer numbers:"); scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); //调用swap函数,用指针变量作实参 printf("max=%d,min=%d\n",*pointer_1,*pointer_2); return 0; } void swap(int *p1,int *p2) //形参是指针变量 { int *p; p=p1; //下面3行交换p1和p2的指向 p1=p2; p2=p; } pointer_1 a &a → 5 pointer_2 b &b → 9 不能企图通过改变指针形参的值而使指针实参的值改变 p1 a &a → 5 p2 b &b → 9 p1 a &b 5 p2 b &a 9 pointer_1 a &a → 5 pointer_2 b &b → 9
指针变量作为函数参数【例8.5】输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现#include<stdio.h>//函数声明void swap(int *pt1, int*pt2):int main()if(*q1<*q2) swap(q1.q2)://如果a<b,交换a和b的值十//函数声明void exchange(int *q1, int *q2, int *q3):if(*q1<+q3)swap(q1.q3)://如果a<c,交换a和c的值if(*q2<*q3) swap(q2,q3):int a.b,c,*p1,*p2,*p3;//如果b<c,交换b和c的值7printf("please enterthree numbers:"):scanf("%d,%d.%d",&a,&b,&c)://交换2个变量的值的函数p1=&a;p2=&b;p3=&c;void swap(int *pt1, int *pt2)exchange(p1.p2.p3)1inttemp://交换*pt1和*pt2变量的值printf("The order is:%d,%d,%d\n",a,b.c):temp=*pt1:return 0:*pt1=*pt2:*pt2=temp;CAWINDOWSlsystem32lcmd.exe口Xleaseenterthreenumbers:20,-54,67is;67,20,-54Theordervoidexchange(int*q1,int*q2.int*q3)//将3个变量的值交换的函数请按任意键继续
指针变量作为函数参数 【例8.5】输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。 #include <stdio.h> int main() { void exchange(int *q1, int *q2, int *q3); //函数声明 int a,b,c,*p1,*p2,*p3; printf("please enter three numbers:"); scanf("%d,%d,%d",&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf("The order is:%d,%d,%d\n",a,b,c); return 0; } void exchange(int *q1, int *q2, int *q3) //将3个变量的值交换的函数 { void swap(int *pt1, int *pt2); //函数声明 if(*q1<*q2) swap(q1,q2); //如果a<b,交换a和b的值 if(*q1<*q3) swap(q1,q3); //如果a<c,交换a和c的值 if(*q2<*q3) swap(q2,q3); //如果b<c,交换b和c的值 } void swap(int *pt1, int *pt2) //交换2个变量的值的函数 { int temp; temp=*pt1; //交换*pt1和*pt2变量的值 *pt1=*pt2; *pt2=temp; }
通过指针引用数组
通过指针引用数组
数组元素的指针一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。可以用一个指针变量指向一个数组元素,a[0]&a[0]1pinta[10]={1,3.5.7.9,11,13.15,17.19)//定义a为包含10个整型数据的数组3int*p;//定义p为指向整型变量的指针变量5p=&a[0];//把a[0]元素的地址赋给指针变量p79引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针找到所需的元素,11p=&a[0]://p的值是a[O的地址//p的值是数组a首元素(即a[O)的地址p=a;1315注意程序中的数组名不代表整个数组,只代表数组首元素的地址。1719在定义指针变量时可以对它初始化int*p:int *p=&a[0];int*p=a;p=&a[0]://不应写成*p=&a[0];
数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地 址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。 所谓数组元素的指针就是数组元素的地址。可以用一个指针变量指向一个数组元素。 引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针找到所需的元素。 在定义指针变量时可以对它初始化: int a[10]={1,3,5,7,9,11,13,15,17,19}; //定义a为包含10个整型数据的数组 int *p; //定义p为指向整型变量的指针变量 p=&a[0]; //把a[0]元素的地址赋给指针变量p p &a[0] → 1 a[0] 3 5 7 9 11 13 15 17 19 p=&a[0]; //p的值是a[0]的地址 p=a; //p的值是数组a首元素(即a[0])的地址 注意 • 程序中的数组名不代表整个数组,只代表数组首元素的地址。 ≡ int *p; int *p=&a[0]; p=&a[0]; //不应写成*p=&a[0]; ≡ ≡ int *p=a;
在引用数组元素时指针的运算执行p+1时并不是将p的值注意在指针已指向一个数组元素时,可以对指针进行以下运算:(地址)简单地加1:而是根,加一个整数(用+或+=),如p+1,表示指向同一数组中的下一个元素;据定义的基类型加上一个数组元素所占用的字节数。:减一个整数(用-或-=),如p-1,表示指向同一数组中的上一个元素;·自加运算,如p++,++p;a数组p·自减运算,如p--,--p。a[0]p+1,a+1a[1]两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意a[2]义),结果是两个地址之差除以数组元素的长度。注意:两个地址不能相加,如p1+p2是无实际意义的。如果p的初值为&a[0].则p+i和a+i就是数组元素a的地址,或者说,它p+ia+j*(p+i)a[i]们指向a数组序号为的元素。*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a。实际上是变址运p+9,a+9算符,即将a按a+计算地址,然后找出此地址单元中的值。a[9]
在引用数组元素时指针的运算 在指针已指向一个数组元素时,可以对指针进行以下运算: • 加一个整数(用+或+=),如p+1,表示指向同一数组中的下一个元素; • 减一个整数(用-或-=),如p-1,表示指向同一数组中的上一个元素; • 自加运算,如p++,++p; • 自减运算,如p-,-p。 两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意 义),结果是两个地址之差除以数组元素的长度。注意: 两个地址不能相 加,如p1+p2是无实际意义的。 如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它 们指向a数组序号为i的元素。 *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。[]实际上是变址运 算符,即将a[i]按a+i计算地址,然后找出此地址单元中的值。 注意 • 执行p+1时并不是将p的值 (地址)简单地加1,而是根 据定义的基类型加上一个 数组元素所占用的字节数。 p a数组 p+1,a+1 a[0] a[1] a[2] p+i,a+i *(p+i) a[i] p+9,a+9 a[9]