其实你的说法对错各一半吧,不用指针的确可以完成有指针的程序。但是指针的用法并不在于此,在函数的调用过程中分两类,一是以值传递,二是以地阯传递(又分为指针传递和数组名传递),其实两者是有区别的,具体的区别给你举个例子吧
1.首先看以值传递
void fun(int a,int b,int c)
{
a=456;b=567;c=678;
}
void main()
{
int x=10,y=20,z=30;
fun(x,y,z);
printf("%d,%d,%d\n",x,y,z);
}
最后的输出结果是10,20,30
2.其次看以地阯传递
void fun(int *x,int *y)
{
*x=3;*y=4;
}
void main()
{
int x=1,y=2;
printf("%d %d",x,y);
fun(&y,&x);
printf("%d %d",x,y);
}
输出结果为1 2 4 3
从上面两个例子来看,当调用函数时是以值的方式来传递的话,形参的值发生变化,而实参的值并没有跟着形参一起改变;当调用函数时是以地阯的方式来传递的话,形参的值发生变化,实参的值也跟着形参一起改变
关键就在于要是想实现变量的真正交换,必须要用地阯传递,而指针和数组名传递其实是一囬事
用指针的话就是传址,其它的都是传值。传址的好处是可以使程序的时间使用率更高。实际上就是用空间换时间。
C语言中函数的形参都是传值的
指针传的是指针值(也就是说.你无法通过调用函数来改变形参指针的值..这时可以考虑用双指针了)
没有什么"不用指针也可完成指针程序"
c语言的许多操作本就基于指针的操作
如:数组也是用指针来操作的
传值和传地址的区别在于函数是否对形参分配内存。
C的函数对简单变量和指针形参分配内存,所以是传值。
但数组作参数,因为数组对内存要求比较苛刻并消耗大量内存,所以不再分配空间,而传地址。
数组传地址的例子:
#include
#include
void f (int a[3]){a[0] = 1; a[1] = 2; a[2] = 3;}
void main()
{
int a[3];
(void) f(a);
printf("%d %d %d\n",a[0],a[1],a[2]);
}
正因为传地址,所以能把函数运算结果带回主程序。
我估计,对于结构也是传地址。
C的函数只能传值,当形参是指针的时候,传进去的值就是地址
相比C,C++多个pass by reference的传递方式