行参实参搞不清楚了

1、如果char str
p=ss(str)
那么
1\ char*ss(char *s)
2\ char ss(char *s)
3\ char ss(char s)
分别是什么意思?
主函数内定义的是char,为什么调用函数要用*?似乎看见很多题目都是这样

2、如果定义int aa[10]={(省略)}
那么
1\ 主函数内sum(&aa[i]) 调用函数内void sum(int *a)
2\ 主函数内sum(aa[i]) 调用函数内void sum(int a)
3\ 主函数内sum(&aa[i]) 调用函数内void sum(int a)
4\ 主函数内sum(aa[i]) 调用函数内void sum(int *a)
我知道第一个是将aa的地址传给调用函数
那第二个是不是将aa的值传给调用函数?
第三个就完全不懂~
第四个和第一个性质一样吗?

C/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如:
void swap_by_value(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}

void swap_by_ptr(int* pa, int* pb)
{
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
int main(int argc, char* argv[])
{
int a=5, b=6;
swap_by_value(a, b);
printf("a=%d, b=%d\n", a, b);
swap_by_ptr(&a, &b);
printf("a=%d, b=%d\n", a, b);
return 0;
}
很显然,通过传值调用并不能改变main函数中的a与b,要想改变a与b的值就必须通过传地址方式,然后在被调用函数中通过指针访问到主函数中的变量。
可是通过传递变量指针就一定是传地址调用么?看下面一个例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_str(char* p)
{
p = (char*)malloc(sizeof("abcd"));
printf("%d\n", sizeof("abcd"));
strcpy(p, "abcd");
return;
}
int main(int argc, char* argv[])
{
char* p = NULL;
get_str(p);
printf("p=%p\n", p);
puts(p);
return 0;
}
其中参数p是一个指针,程序想通过p来得到在get_str(char* p)中分配的一块内存。但是上面的代码并不能完成此功能。原因是程序需要在get_str(char* p)中修改main函数中的指针变量p,使其指向malloc返回的一块内存,要想在 get_str(char* p)中修改main函数中p的值就只有把p的地址传过去,在get_str中通过地址访问主函数中的变量p。正确的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_str(char** p)
{
*p = (char*)malloc(sizeof("abcd"));
printf("%d\n", sizeof("abcd"));
strcpy(*p, "abcd");
return;
}
int main(int argc, char* argv[])
{
char* p = NULL;
get_str(&p);
printf("p=%p\n", p);
puts(p);
return 0;
}

引用是C++中的语法,结合了传地址和传值的优点,即传递的是一个地址,但在形式上又没有指针那个怪异的符合*,看上去舒服多了。
下面是一个传引用版的swap()函数
void swap_by_ref(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}

int main(int argc, char* argv[])
{
int a=5, b=6;
swap_by_ref(a, b);
return 0;
}

总之,如果想在被调用函数中改变哪个变量的值就需要把那个变量的地址传给被调用函数,这样在被调用函数中通过地址就可以访问和修改这个变量。传值的时候会对参数进行拷贝,然后传给被调用函数,而传地址只是对地址进行一份拷贝,然后赋给形参,这样在C++中如果传递一个比较大的对象时效率就有所区别了。对于简单类型的变量来说传值和传地址在根本上是没有区别的,都是传递一个数给被调用函数,而怎样去解释和使用这个数是我们事先约定好的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-04-04
定义char*ss(char *s) 返回的是指针,所以用*
char ss(char *s) char ss(char s)返回普通字符

3\ 主函数内sum(&aa[i]) 调用函数内void sum(& a) 是引用地址~和指针差不多

c语言中形参和实参的区别?
形参不是实际存在变量,又称虚拟变量。2、目的不同:实参可以是常量、变量或表达式,无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值,以便把这些值传送给形参。需要注意当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的...

形参与实参的区别,怎么区分呢
1、实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”。2、形参:不是实际存在变量,又称虚拟变量。二、目的不同 1、实参:可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值, 以便把这些值传送给形参。2、形参:定义函数名和函数体的时候使用...

编写程序时 实参和形参老搞混怎么办?
1. **命名清晰**:给函数和参数起具有描述性的名称,以便在代码中更容易理解它们的作用。例如,如果一个函数计算两个数字的和,可以将参数命名为 `num1` 和 `num2`,而函数可以命名为 `calculate_sum`。2. **注释和文档**:在函数定义和调用的地方添加注释,解释每个参数的作用和类型。如果您在...

什么叫实参 形参 怎么用 区别
形参不是实际存在变量,又称虚拟变量。2、目的不同:实参可以是常量、变量或表达式,无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值,以便把这些值传送给形参。需要注意当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的...

形参与实参的区别
- 实参:在调用有参函数时,函数名后面括号中的参数,即实际传入的参数。- 形参:函数定义时参数列表中的参数,不是实际存在的变量,也称作虚拟变量。2. 目的不同:- 实参:可以是常量、变量或表达式。在函数调用时,实参必须具有确定的值,用于将这些值传递给形参。- 形参:在函数内部使用,用于接收...

实参和形参的区别
首先,形参是在函数被调用时创建的,它在函数内部占有内存,但一旦函数执行完毕,形参所占内存即被释放,这意味着形参仅在函数执行期间有效,调用结束后无法再访问。相反,实参则可以是常量、变量、表达式或函数,它们在调用时需要有明确的值,以便传递给形参。例如,函数void add(int a, int b)中的a和...

形参和实参区别是什么
1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值...

那个什么实参,形参真是搞不懂。还有那个调用语句也不太清楚
形参是在定义过程是的一种形式虚设的参数,指代笔挨了该过程参数的个数,类型,位置,形参的名字并不重要,也没有任何值,只代表了该过程内进行的某种运算或处理。形参不能使常量,表达式或数组元素 实参时调用子过程时提供给过程形参的初始值或通过过程体处理后获得的结果。

形参和实参是什么意思?
1. 主体区分: 当我们在函数调用中使用有参函数时,那些在函数名后面括号中的具体值被称为实参。实参可以是常量、变量或者表达式,它们是实实在在参与运算的参数。相反,形参并非实际存在的变量,它是一个虚拟的占位符,用来接收实参传递过来的值。2. 目的不同: 实参的作用是将具体的值传递给形参,以...

什么是形参和实参
实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。函数的形参和实参具有以下特点:1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的...

相似回答
大家正在搜