实参与形参的传递方式c语言,形参和实参之间的三种传递方式

本文详细解析了C++中形参作为整型、引用和指针时,与实参之间的三种传递方式,包括基本概念、数组元素访问和实战示例。特别关注了指针指向数组时的正确操作,以及函数参数传递中常见的陷阱和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//形参和实参之间的三种传递方式

void fun(int i)

{  i++;}

void fun(int &i)

{  i++;}

void fun(int *i)

{  *i=*i+1;}

若指针指向的是数组的首地址,则数组元素的访问方式

1.数组名[i]  指针名[i]

2.*(数组名+i)  *(指针名+i)

字符型数组的指针:

char *p,name[10];

p=name;

p="smith"; //可以等于字符串常量的地址。

name="smith";//错误的,因为数组名是指针(地址)的常量,定义后不能改变其值。

cout<

cout<

//形参是数组,实参是数组

void fun(char name[])    // 或者写为char name[]

{  cin>>name;}

void main()

{char n[10]; fun(n); cout<

//形参是指针,实参是数组

void fun(char *p)    // 或者写为char name[]

{  cin>>p;}

void main()

{char n[10]; fun(n); cout<

//形参是数组,实参是指针

void fun(char name[])    // 或者写为char name[]

{  cin>>name;}

void main()

{char n[10]; char *p=n;

fun(p); cout<

#include

#include

void fun(char name[])    // 或者写为char name[]

{

strcpy(name,"smith");

}

void main()

{

char n[10];

char *p=n;

fun(p);

### C语言中结构体的实参形参传递方式 在C语言中,当涉及到结构体作为函数参数时,主要存在两种传递方式:值传递指针传递。 #### 值传递 如果将整个结构体变量作为函数参数,则采用的是 **值传递** 的方式。在这种情况下,会创建一个结构体变量的副本并将其传递给函数[^2]。这意味着,在函数内部对形参所做的任何更改都不会影响到原始的实参变量。这种方式类似于其他基本数据类型的值传递机制。 例如: ```c struct Person { char name[20]; int age; }; void modifyPerson(struct Person p) { strcpy(p.name, "John"); p.age = 30; } int main() { struct Person person = {"Alice", 25}; modifyPerson(person); printf("Name: %s, Age: %d\n", person.name, person.age); // 输出仍是 Alice 25 return 0; } ``` 上述代码展示了通过值传递方式调用 `modifyPerson` 函数后,原结构体变量 `person` 并未受到影响。 #### 指针传递 另一种常见的方法是使用 **指针传递** 来处理结构体。此时,际上传递给函数的是指向该结构体的一个指针而非完整的结构体对象本身[^3]。因此,在这种模式下,函数内的操作能够直接影响外部定义的际参数内容。 下面是一个例子来说明这一点: ```c void modifyPersonWithPointer(struct Person *p) { strcpy(p->name, "John"); p->age = 30; } int main() { struct Person person = {"Alice", 25}; modifyPersonWithPointer(&person); printf("Name: %s, Age: %d\n", person.name, person.age); // 输出变为 John 30 return 0; } ``` 这里可以看到,由于我们向 `modifyPersonWithPointer` 提供了一个指向 `person` 对象的指针,所以对其字段所作出的变化也反映到了主程序中的 `person` 变量上。 #### 关于深拷贝与浅拷贝的概念 需要注意的是,“深拷贝”以及“浅拷贝”的概念通常适用于更复杂的场景比如动态分配内存或者嵌套容器等情况下的复制行为讨论之中;而在简单的结构体内存布局里(如固定大小数组加若干基础类型成员),一般不会特别区分这两者之间的差异。不过严格来说,当我们仅简单赋值两个相同类型的结构体之间的时候可以认为这是浅拷贝因为只是逐位复制而已而没有涉及额外资源管理等问题[^1]。 综上所述,对于C语言里的结构体而言,默认情况下的传值属于按值语义即完全独立的新体被构建出来用于局部作用域内运算之需;反之借助指针则允许共享同一份底层存储区域从而现交互效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值