c语言函数改变参数,c语言函数改变实参

C语言奇淫技巧之函数的可变参数

前言:

成都创新互联始终坚持【策划先行,效果至上】的经营理念,通过多达10多年累计超上千家客户的网站建设总结了一套系统有效的全网整合营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:垃圾桶等企业,备受客户好评。

有时候我们需要一个函数接口可以支持可变参数以提高其泛化能力,比如说定义一个求和函数,对传入的所有参数进行求和并返回,C语言提供了一种可变参数的方式来帮助我们实现。

原理:

函数参数是从右向左线性连续依次入栈,如果我们可以知道可变参数列表的前一个参数的地址和类型,就可以得知可变参数列表的首地址,进而根据每个参数的类型取出相应的数据。简单来说就是将栈里面的数据,按照指定类型的大小,依次取出。

具体实现:

步骤解析:

c语言中函数可否改变参数值

C语言可以通过传递指针来改变变量的值:

int

a=5;

void

f(int

*a)

{

*a

=

6;

}

调用函数

f(a);

则现在

a=6;

c语言中指针函数可以改变实参的值吗

c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。

但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。

因此,使用swap函数进行数据交换时,必须保证两点:

1.

参数必须是指针类型,指向待交换的数据

2.

交换时,必须交换地址中的数据,而不是交换地址本身。

参考代码:

//错误的交换代码1

void swap1( int a, int b ) //参数不是待交换数据的指针

{

int t=a;

a=b;

b=t;

}

//错误的交换代码2

void swap2( int *a, int *b )

{

int *t=a;//交换形参变量本身

a=b;

b=t;

}

//正确的交换代码

void swap( int *a, int *b )

{

int t=*a;//交换形参变量地址中的数据,指针变量不变

*a=*b;

*b=t;

}

C语言中可否定义一个函数,这个函数的形参数量可以改变?

当然可以,最典型的就是printf函数了,这个函数采用的就是可以改变形参数量的方法,百度上搜索:“C语言不定参数”就可以查到相关信息了C语言中的不定参数

C语言函数调动参数问题

#include stdio.h

//指针加*是不会改变其指向的,只会修改其中的内容

int *f(int *s, int *t) //s指向i,t指向j

{

if (*s  *t) //这里比较的是i与j的值

{

*s = *t; //*s表示取s地址的内容,即i,所以*t是表示j,这里是将j赋值给i

//所以改变了i的值,但是并没有改变s与t的指向,还是分别指向i与j

}

return s;

}

int main()

{

int i = 3, j = 5;

int *p = i; //p是指向i的

int *q = j; //q是指向j的

int *r;

r = f(p, q); //将s的地址赋值给r

printf("%d, %d, %d, %d, %d\n", i, j, *p, *q, *r);

return 0;

}

运行结果是:5, 5, 5, 5, 5

#include stdio.h

int k = 5;

void f(int *s) //这里传参只是将p的地址赋值给s,也就是将s指向了m

{

s = k; //将s指向k,并没有改变p的指向

}

int main()

{

int m = 3;

int *p = m;

f(p); //所以程序执行完,p还是指向m,而s是指向k的

printf("%d, %d\n", m, *p);

return 0;

}

运行结果:3, 3

#include stdio.h

//指针加*是不会改变其指向的,只会修改其中的内容

//如果指针不加*,则赋值就是改变其指向

int *f(int *s, int *t) //s指向i,t指向j

{

if (*s  *t) //这里比较的是i与j的值

{

s = t; //s表示的是指针,这里不是表示其内容,所以这里是将t指向的地址赋值给了s

//也就是s与t是指向同一块内存空间,也就是将s也指向了j

}

return s;

}

int main()

{

int i = 3, j = 5;

int *p = i; //p是指向i的

int *q = j; //q是指向j的

int *r;

r = f(p, q); //将s的地址赋值给r,r也指向了j

printf("%d, %d, %d, %d, %d\n", i, j, *p, *q, *r);

return 0;

}

运行结果:3, 5, 3, 5, 5

这一类题目其实只要打个草稿就行了,写两个数字,然后*p就是表示取其中的内容,p就表示其指向(也就是内容的地址),只要是加*的赋值就表示改变其p指向的变量赋值,如果没有加*就是改变指针的指向。


当前标题:c语言函数改变参数,c语言函数改变实参
分享网址:http://ybzwz.com/article/hspogj.html