02_05_指针做参数输入输出特性

本文介绍了一个使用C语言编写的程序,该程序展示了如何在不同场景下进行内存管理,包括通过主调函数分配内存、被调用函数分配内存并传递地址等。通过具体的函数实现,解释了如何避免对空指针或未知内存地址进行操作,以及如何正确地释放内存。

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

#define _CRT_SECURE_NO_WARNINGS//强行去掉安全检查
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>


void fun(char *p)
{
strcpy(p, "chenqi-jiayou");
}
void fun2(char *p)
{
strcpy(p, "chenqi-jiayou");
//不能给空,或者未知的内存地址赋值
}
void fun3(char **p,int *len )
{
if (p == NULL)
{
return;
}
else
{
char *tmp = (char *)malloc(100);
if (tmp == NULL)
{
return;
}
else
{
strcpy(tmp, "adfadfaf");
*p = tmp;
*len = strlen(tmp);
}
}
}


void main()
{
//输入 主调函数分配内存
char buf[100] = { 0 };//定义一个字符数组,数组元素全部初始化为0
fun(buf);
printf("buf=%s\n", buf);


char *str = NULL;//不能给空,或者未知的内存地址赋值
//str = buf;  如果这个指针有一个指向的内存地址就可以
//fun2(str);


//输出,被调用函数分配内存,地址传递


char *q = NULL;
int len = 0;
fun3(&q,&len);
if (q != NULL)
{
printf("q=%s,len=%d", q,len);
}
system("pause");
}
### C++ 中 `const` 关键字用于函数参数传递 #### 输入型参数 当希望确保某个参数仅被读取而不被修改时,可以将其声明为带有 `const` 的引用或指针。这不仅提高了程序的安全性和可维护性,还向其他开发者传达了意图。 对于按值传递的情况,由于每次都会复制实参给形参,因此通常不需要显式地加上 `const` 修饰符;但对于大对象来说,这样可能会带来性能开销。此时应考虑改用常量引用的方式[^1]: ```cpp void process(const std::string& str) { // 只能访问str的内容而不能改变它 } ``` 上述例子展示了如何通过接受字符串类型的常量引用来避免不必要的拷贝操作,并且保证内部不会更改传入的对象状态。 #### 输出型参数 如果一个参数既可能充当输入也可能成为输出,则不应简单地标记为 `const` 。然而,在某些情况下确实存在这样的需求——即允许外部观察到变化的同时保持接口的一致性。这时可以通过返回新创建的结果来实现这一目标而不是直接操纵原始数据结构。 另外需要注意的是,即便是在传出模式下也不能滥用 `const` ,因为一旦加了这个限定词就意味着承诺不对外部可见的状态出任何实质性的改动[^3]。 #### 组合使用情况 有时也会遇到同时具有输入和输出特性的复杂场景。比如容器类的操作往往涉及迭代器范围内的元素更新动作。针对这类情形下的最佳法是区分对待不同性质的部分:对于那些只负责提供初始条件或者辅助信息的角色应当尽可能早地施加不可变约束;而对于承载最终结果的任务则不必强求一致[^4]。 ```cpp // 假设有一个vector<int> vec; std::pair<std::vector<int>::iterator, bool> find_and_modify(std::vector<int>& container, const int targetValue) { auto it = std::find(container.begin(), container.end(), targetValue); if (it != container.end()) { *it *= 2; // 修改找到的第一个匹配项 return {it, true}; } return {container.end(), false}; } ``` 在这个实例里,`targetValue` 是典型的输入参数并已标记为 `const` 类型,表示其在整个过程中不应该发生变化;相反地,`container` 则扮演着双重角色——既是查询依据也是潜在的变化载体,所以并未附加额外限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值