指针变量作为函数参数使用时注意的问题!

来源:互联网 发布:巴洛克风格服装 知乎 编辑:程序博客网 时间:2024/05/29 18:19
#include <stdio.h>
int main()
{
void swap(int *p1, int *p2);
int a, b;
int *pointer1, *pointer2;
printf("please enter a and b:\n");
scanf_s("%d,%d", &a, &b);
pointer1 = &a;
pointer2 = &b;
if (a < b)
swap(pointer1, pointer2);
printf("max=%d,min=%d\n", a,b);
return 0;
}

/*使用1这个时,符合要求

please enter a and b:

5,9

max=9,min=5

*/  

void swap(int *p1, int *p2){
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;

}


void swap(int x,int y)

{int temp;

temp=x;

x=y;

y=temp;

}

在main函数中调用swap函数:

swap(a,b);

执行完后,x和y的值是互换了,但并未影响到a和b的值。在函数结束时,变量x和y释放了,main函数中的a和b并未互换。


注:为了使在函数中改变了的变量值能被主调函数main所用,不能采用上述方法,而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来,这样就实现了“通过调用函数使变量的值发生变化,在主调函数(如main函数)中可以使用这些改变了的值”的目的。


另外,

/*使用2这个时,不符合要求

please enter a and b:

5,9

max=5,min=9

*/ 

void swap(int *p1, int *p2){
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}


解释:不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量(对象)的值。



总结:在主函数如main中要使用 “通过调用函数使变量的值发生变化”这样一个变化了的变量值,首先要使用指针变量作为函数参数,其次在调函函数的函数体中不能改变实参指针变量的值,可以改变实参指针变量所指变量(对象)的值。



应用:输入3个整数,要求按大到小的顺序输出。

#include <stdio.h>
int main()
{
void exchange(int *q1, int *q2, int *q3);
int a, b, c;
int *p1, *p2, *p3;
printf("please enter three integer numbers:\n");
scanf_s("%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)
{
void swap(int *pt1, int *pt2);
if (*q1 < *q2)
swap(q1, q2);
if (*q1 < *q3)
swap(q1, q3);
if (*q2 < *q3)
swap(q2, q3);
}


void swap(int *pt1, int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}



紧接着上面的内容,今天再次学习到“指针引用一位数组”

先看下面的一个用“选择法”的从大到小的排序问题:

#include <stdio.h>
int main()
{
void sort(int*x, int n);
int i, a[10] = { 3, 7, 9, 8, 0, 6, 1, 5, 4, 2 };
int *p = a;
printf("The original array:\n");
for (i = 0; i < 10; i++)
printf("%d", *p++);
printf("\n");
p = a;
    sort(p, 10);
printf("The array has been sorterted:\n");
for (p=a,i=0; i < 10; i++,p++)
printf("%d", *p);
printf("\n");
return 0;
}


void sort(int*x, int n)
{
int i, j, k,temp;
for (i = 0; i < 10; i++)
{
k = i;
for (j = i + 1; j < 10; j++)
{
if (*(x + k) < *(x + j))
k = j;
}
if (k != i)
{
temp = *(x + i); 
*(x + i) = *(x + k);
*(x + k) = temp;
}
}

指针在数组中的引用问题,关注以下几点:

int *p = a;

p = a;    p = &a[0];     p + i = &a[i];   

 *p = a[0];        *(p + i) = a[i];

主函数main 与 调用函数 的实参、形参组合方式4种。

数组名~指针变量,牢记要将两者关联起来、对应起来。

0 0
原创粉丝点击