C/C++指针传参,多传参思想

本文探讨了在C/C++中如何通过指针传递参数,以实现被调函数修改主调函数变量的方法。总结指出,必须传递变量的地址,尤其当变量本身是指针时,需要传递指向指针的指针。文中列举了三种实现方式:通过返回字符指针和整型指针、将主调函数指针作为形参以及自定义数据结构来达到目的。

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

1. 先写结论

如果想通过指针在被调函数中修改主调函数的变量,必须将主调函数变量的地址作为参数,在被调函数中修改指针指向的内容。

如果要修改的变量本身就是指针,就应该将指针的地址作为参数,此时形参类型是指向指针的指针。

2. 三种方法实现被调函数修改主调函数的变量

例子参阅于《程序员面试笔记-C/C++、算法、数据结构篇》。

已知姓名用“名字#姓氏”的方式存储在字符串中,例如James#Lebron。编写一个getName函数,获取名字中名字的长度并获取姓氏。

2.0 较为常见的将字符指针做返回值,整型的名字长度做指针形参。

char * getName(char * s,int * num)
{
	int i;
	for (i = 0; *(s + i) != '\0';i++)
	{
		if (s[i] == '#')
		{
			*num = i;
			return (s + i + 1);
		}
	}
}

int main()
{
	char name_str[] = "Jordan#Michael";
	int num = 0;
	char * p = NULL;
	p = getName(name_str,&num);
	cout << p << " " << num << endl;
}

被调函数内直接返回一个地址,主调函数中的指针接收,程序没问题。

2.1 将主调函数指针做形参传递进被调函数

void getName(char * s, int * num,char **p)
{
	int i;
	for (i = 0; *(s + i) != '\0';i++)
	{
		if (s[i] == '#')
		{
			*num = i;
			*p = s + i + 1;
			return;
		}
	}
}

int main()
{
	char name_s
### C++ 中通过指针递字符串参数 在 C++ 中,可以通过指针将字符串为参数递给函数。由于 C 风格的字符串是以字符数组的形式存储,并以 `\0` 结尾表示结束位置,因此可以利用字符指针 `char*` 来处理这些字符串。 #### 字符串指针参数的示例代码 以下是一个简单的例子,展示如何使用指针递字符串并对其进行修改: ```cpp #include <iostream> using namespace std; // 函数定义:接受一个 char 类型的指针为参数 void modifyString(char* str) { // 修改字符串的内容 for (int i = 0; str[i] != '\0'; ++i) { str[i] = toupper(str[i]); // 将每个字符转为大写 } } int main() { char myStr[] = "hello world"; // 定义一个可修改的字符串 cout << "调用函数前myStr的: " << myStr << endl; modifyString(myStr); // 调用函数,递字符串 cout << "调用函数后myStr的: " << myStr << endl; return 0; } ``` #### 解析 1. **字符串的本质** 在上述代码中,`char myStr[] = "hello world"` 实际上创建了一个字符数组,并将其初始化为 `"hello world\0"`[^2]。当该数组被递到函数 `modifyString` 时,实际上是递了它的首地址(即第一个元素的位置)。这使得函数能够直接访问修改原始字符串中的内容。 2. **指针用** 函数 `modifyString` 接收的是一个指向字符的指针 `char* str`。这意味着它可以遍历整个字符串直到遇到终止符 `\0`,并对其中的每一个字符进行操。在这个例子中,我们使用标准库函数 `toupper()` 将所有字母转换成大写字母[^3]。 3. **注意事项** - 如果希望保护原字符串不被修改,则应考虑使用常量指针 `const char*` 或者复制一份新的字符串副本再进行修改。 - 对于不可变字符串字面量(如 `"hello world"`),尝试对其内容进行修改会导致未定义行为,因为它们通常位于只读内存区域[^1]。 --- ### 常见错误及解决方案 如果试图像下面这样编写程序: ```cpp void modifyString(const char* str); ... modifyString("hello"); ``` 则会出现编译器警告或运行时崩溃,原因是字符串字面量本身是不可更改的对象,任何企图改变的行为都是非法的。 为了安全起见,在实际开发过程中推荐如下做法之一: - 创建动态分配的空间; - 使用 STL 提供的数据结构如 `std::string` 替代裸指针管理方式; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值