main() { int num1,num2; int *num1_p=&num1, *num2_p=&num2, *pointer; printf(“Input the first number: ”); scanf(“%d”,num1_p); printf(“Input the second number: ”); scanf(“%d”,num2_p); printf(“num1=%d, num2=%d\n”, num1, num2); if( *num1_p > *num2_p ) pointer= num1_p, num1_p= num2_p, num2_p=pointer; printf(“min=%d, max=%d\n”, *num1_p, *num2_p); } 程序运行情况: Input the first number:9←┘ Input the second number:6←┘ num1=9, num2=6 min=6, max=9 程序说明: (1)第5行的if语句 如果*num1_p>*num2_p (即num1>num2),则交换指针,使num1_p指向变量num2(较小值),num2_p指向变量num1(较大值)。 (2)printf(“min=%d, max=%d\n”, *num1_p, *num2_p); 语句:通过指针变量,间接访问变量的值。 本案例的处理思路是:交换指针变量num1_p 和num2_p的值,而不是变量num1和num2的值(变量num1和num2并未交换,仍保持原值),最后通过指针变量输出处理结果。 10.2.2 指针变量作函数参数 1.指针变量,既可以作为函数的形参,也可以作函数的实参。 2.指针变量作实参时,与普通变量一样,也是“值传递”,即将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。 注意:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。 [案例9.3] 使用函数调用方式改写[案例9.2],要求实参为指针变量。 void exchange(int *pointer1, int *pointer2) { int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; }
main() { int num1,num2;
int *num1_p=&num1, *num2_p=&num2; printf(“Input the first number: ”); scanf(“%d”, num1_p); printf(“Input the second number: ”); scanf(“%d”, num2_p); printf(“num1=%d, num2=%d\n”, num1, num2); if( *num1_p > *num2_p ) exchange(num1_p, num2_p);
printf(“min=%d, max=%d\n”, num1, num2); } 程序运行情况: Input the first number:9←┘ Input the second number:6←┘ num1=9, num2=6 min=6, max=9 调用函数exchange()之前、之时、结束时和结束后的情况,如图9-5所示。 形参指针变量pointer1(指向变量num1)和pointer2(指向变量num2),在函数调用开始时才分配存储空间,函数调用结束后立即被释放。 虽然被调用函数不能改变实参指针变量的值,但可以改变它们所指向的变量的值。 总结:为了利用被调用函数改变的变量值,应该使用指针(或指针变量)作函数实参。其机制为:在执行被调用函数时,使形参指针变量所指向的变量的值发生变化;函数调用结束后,通过不变的实参指针(或实参指针变量)将变化的值保留下来。 [案例9.4] 输入3个整数,按降序(从大到小的顺序)输出。要求使用变量的指针作函数调用的实参来实现。
void exchange(int *pointer1, int *pointer2) { int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; }
main() { int num1,num2,num3;
printf(“Input the first number: ”); scanf(“%d”, &num1); printf(“Input the second number: ”); scanf(“%d”, &num2); printf(“Input the third number: ”); scanf(“%d”, &num3); printf(“num1=%d, num2=%d, num3=%d\n”, num1, num2, num3);
printf("Input the number of student No.%d(6 bytes): ", count+1); scanf("%6s", new->no); if(strcmp(new->no,"000000")==0) { free(new); break; } printf("Input the score of the student No.%d: ", count+1); scanf("%d", &new->score); count++;