c语言函数传参数
1. c语言函数参数传出怎么用
struct Student st;
void function(struct Student st);这种形式就是传递地址;
void fuction2(struct Student * pst);这种形式就是传递结构体的地址;
调用这两个函数的形式如下:
function(st);
fuction2(&st);
一般推荐第二种方式,因为第一种方式需要传递整个结构体,需要开辟sizeof(struct student)这么大的内存空间,开销太大,第二种方式则只需要开辟四个字节的内存,用来存放地址;
2. C语言自定义函数怎么传参,一次性把数组的数据全部传入
数组参数属于指针参数.
指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径.
如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针.
1. 数组参数就是指向第一个元素的指针: #include <stdio.h>
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i < si; i++) {
printf("%d\n", p[i]);
}
}
2. 干脆直接声明为指针: #include <stdio.h>
void getArr(int *p, int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int *p, int si) {
int i;
for (i = 0; i < si; i++) {
printf("%d\n", p[i]);
}
}
3. 即使你在形参中指定维数也不起作用: #include <stdio.h>
void getArr(int p[2], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[2], int si) {
int i;
for (i = 0; i < si; i++) {
printf("%d\n", p[i]);
}
}
4. 既然是指针, 其值就有被修改的可能: #include <stdio.h>
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
size_t i;
getArr(ns, sizeof(ns)/sizeof(ns[0]));
for (i = 0; i < sizeof(ns)/sizeof(ns[0]); i++) {
printf("%d\n", *(ns+i));
}
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i < si; i++) {
p[i]++;
}
}
5. 如果是字符数组, 它自己能判断数组尾界: #include <stdio.h>
void getArr(char p[]);
int main(void)
{
char ns[] = "ABCDEFG";
getArr(ns);
getchar();
return 0;
}
void getArr(char p[]) {
int i;
for (i = 0; p[i]; i++) {
printf("%c: %d\n", p[i], p[i]);
}
}
3. C语言函数调用参数传递的是什么
C语言传递的是值而不是地址,这一点从VB转过来的程序员一定要注意。否则不经意间就会犯错误。另外下层函数修改上层函数变量不是一种好习惯,容易引发错误。C语言中函数可以返回一个函数值,如果你需要返回多个函数值可以用下面的形式
fun(int *a, int *b)
{ *a=1;*b=2;}
main()
{ int a, b;
fun(&a,&b) a,b的值被改变
}
如果按VB的习惯,
fun(int a, int b)
{ a=1;b=2;}
main()
{ int a, b;
fun(a,b);a、b的值没有改变
}
是错误的,main中的a,b和fun中的a,b完全是两码事,结果就是调运fun没有任何效果。
4. c语言向函数传递函数作为参数
#include<stdio.h>
//---子函数声明---//
intfunc1();
intfunc2(int(*func1)());//形参为函数指针(即指向函数的指针)
//---主函数---//
intmain(){
printf("向函数二传递函数一, 即函数一作为函数二的参数。 ");
printf("%d",func1());
printf("%d ",func2(func1));//注意函数名即为函数地址!!!!!!
}//实参为函数名func1或者&func1,两者等价,而非func1()
//---子函数定义---//
intfunc1(){
return1;
}
intfunc2(int(*func1)()){//形参为函数指针(即指向函数的指针)
returnfunc1()+1;
}
5. c语言函数传参问题
说下传值,传址以及引用吧。
传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。
传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。
传引用,实际是通过指针来实现的,能达到使用的效果如传址,可是使用方式如传值。
说几点建议:
如果传值的话,会生成新的对象,花费时间和空间,而在退出函数的时候,又会销毁该对象,花费时间和空间。
因而如果int,char等固有类型,而是你自己定义的类或结构等,都建议传指针或引用,因为他们不会创建新的对象。
6. 在C语言中,定义一个函数的形参和实参之间具体是如何进行参数传递的
传值调用和引用调用传值调用和引用调用指的是用于参数传递过程中的一种机制。传值调用中,只使用了实参的值。传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。在引用调用机制里,将实参的地址传递给形参,从表面上看是以实参变量取代形参,因此任何发生在形参上的改变实际上都发生在实参变量上。
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。没有形参的函数在形参表的位置应该写void.main
函数也可以有形参和返回值,其形参也称为命令行参数,由操作系统在启动程序时初始化,其返回值传递给操作系统。
形参和实参的对照实例(C语言版)main(){int
n;printf("input
number
\n");scanf("%d",&n);s(n);printf("n=%d\n",n);}int
s(int
n){int
i;for(i=n-1;i>=1;i--)n=n+i;printf("n=%d\n",n);}
7. c语言中,带参数的主函数,如何传递参数给它
不可能按值传递的,设想一下
type
*arr
=。。。。。
sizeof(arr)为100万了字节,如果按照值传递,就要创建一个临时变量temp也为100万个字节,效率岂不是太低了。再可能arr是堆内存,参数传递是要属性相同,值相同,难道系统自行去new一段内存,这该用户去释放
还是系统自动回收呢?
8. c语言函数参数传递方向
C语言中函数参数传递的三种方式(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数
9. C语言函数参数的传入
你这是
参数传递
进去的其实是数组的地址,在函数内部修改了以后,数组的内容就已经真正的修改了,所以函数返回以后,继续访问这个数组,得到的数据就是修改以后的。
比如:
int array[12][12];
_arcs(arrar)
在访问array就是修改后的数据了
10. c语言:字符串做为函数参数传递
1、值传递
void swap(int x,int y)
{ int temp = x;
x = y;
y = temp;
}void main()
{
int a = 10, b = 20;
swap(a, b);
}
执行后,并不会交换。
2、引用传递
void swap(int &x,int &y)
{ int temp = x;
x = y;
y = temp;
}void main()
{
int a = 10, b = 20;
swap(a, b);
printf("a=%d b=%d ", a, b);
}
执行后,发生交换。
3、指针传递
void swap(int *x,int *y)
{ int temp = *x; *x = *y; *y = temp;
}void main()
{
int a = 10, b = 20;
swap(&a, &b);
printf("a=%d b=%d ", a, b);
}
执行后,发生交换。
参数传递只有上面三种,但是如果加上数组,就会产生几种新形式。
首先,明确数组型变量名本身只是该数组所占存储空间的首地址:
int a[3] = { 1, 2, 3 }; int *p = a; //等价于下行 //int *p = &a[0];
printf("%d", *p);
典型的数组做参数。
void fun(char s[]){ for (int i = 0; s[i] != '