以下是该程序的正确代码
#define _CRT_SECURE_NO_WARNINS
#include<stdio.h>
int Swap(int* a, int* b)//定义一个函数,形参为两个变量的指针
{
int temp;//定义一个整形的中间变量。
temp = *a;//将指针a解引用,并将a的值赋给temp。
*a = *b;//将指针b解引用,赋值给a。
*b = temp;//将temp中a的值赋给b,完成a和b值的调换。
return 0;
}
int main()
{
int n = 100, m = 20;//定义两个变量并赋值。
Swap(&n, &m);//调用函数,并传入两个变量的指针。
printf("%d,%d", n, m);//输出调换后两个变量的值。
}
在写该程序是,经常出现以下一些错误
一.
void
Swap
(
int
a
,
int
b
)
{
int
tmp
=
a
;
a
=
b
;
b
=
tmp
;
}
int
main
()
{
int
a
=
10
;
int
b
=
20
;
printf
(
"
交换前
:a=%d,b=%d\n"
,
a
,
b
);
Swap
(
a
,
b
);
printf
(
"
交换后
:a=%d,b=%d\n"
,
a
,
b
);
return
0
;
}
这个代码调用Swap函数时输入的是
变量的值
而不是
指针
,而在
函数Swap中
的a和b与
主函数中
的a和b的地址并不一样,所以Swap中所交换的a,b的值对主函数中的a,b的值没有影响。最后Swap中的a与b的值进行了调换,但主函数中的a和b的值保持不变。
二.
void
Swap
(
int*
p1
,
int*
p2
)
{
int*
tmp
=
p1
;
p1
=
p2
;
p2
=
tmp
;
}
int
main
()
{
int
a
=
10
;
int
b
=
20
;
printf
(
"
交换前
:a=%d,b=%d\n"
,
a
,
b
);
Swap
(
&
a
,
&
b
);
printf
(
"
交换后
:a=%d,b=%d\n"
,
a
,
b
);
return
0
;
}
相比于上一个错误,这串代码在调用Swap函数时传入的是a和b的指针。除此之外,在Swap函数中进行了a和b的指针交换,最终结果依然没有调换成功。原因是只是调换了a和b的指针地址,a和b的值依然没有发生交换,所以应该对穿来的指针进行解引用之后在进行交换。
三.
void
Swap
(
int*
p1
,
int*
p2
)
//
编译错误
,
老的编译器程序崩溃
{
int*
tmp
;
//tmp
的值是随机值或者
-858993460(0xcccccccc)
*
tmp
= *
p1
;
//
错误
*
p1
= *
p2
;
*
p2
= *
tmp
;
}
int
main
()
{
int
a
=
10
;
int
b
=
20
;
printf
(
"
交换前
:a=%d,b=%d\n"
,
a
,
b
);
Swap
(
&
a
,
&
b
);
printf
(
"
交换后
:a=%d,b=%d\n"
,
a
,
b
);
return
0
;
}
这串代码在调用Swap时传入的是指针,在Swap中也是先对指针解引用后对a和b的值进行交换,但对这串代码进行编译时显示错误。原因是temp并没有得到初始化,所以不能直接使用temp的指针也不能解引用,这种也叫做野指针。