从 C++ 中的函数操作字符数组缓冲区
Manipulating a char array buffer from a function in C++
我想创建一个char数组,我们称之为缓冲区。然后我想将指向缓冲区的指针传递给各种函数并操作缓冲区。
以下是描述目标的代码片段:
void manipCharBuffer(char* buffer) {
buffer = "DERP";
cout << buffer;
}
int main() {
char buffer[256] = "JUNK STRING";
std::cout << buffer;
manipCharBuffer(buffer);
ctd::cout << buffer;
}
为什么manipCharBuffer
不更改缓冲区?就像它在函数内部仍然只有本地范围一样。
这是正在发生的事情的真实世界的类比。我在一张纸上写下我的电话号码。我给你一份那张纸。在副本上,你删除我的号码并写下你自己的号码。然后你拨打你刚刚写的号码。
在这个函数中:
void manipCharBuffer(char* buffer) {
buffer = "DERP";
名称buffer
与buffer
在main
中不同。为避免混淆,您可以使用不同的变量名称,例如:
void manipCharBuffer(char* p_buffer) {
p_buffer = "DERP";
希望这能清楚地说明为什么在这里main
没有区别。您正在将本地指针p_buffer
设置为指向不同的 char 数组。("DERP"
是位于内存中某处的字符数组)。
如果要将字符从一个字符数组复制到另一个字符数组,则必须编写复制字符的代码;一种方法是:
std::strcpy( p_buffer, "DERP" );
在 main 函数中,变量缓冲区指向堆栈上分配的 256 个字符的数组。当它发送到函数manipCharBuffer时,地址是按值传输的。这意味着每次调用函数manipCharBuffer都会创建一个也命名为buffer的局部变量,该变量存储在内存中与主函数中的变量缓冲区不同的位置,但两者都指向内存中的同一位置。所以这条线的结果:
buffer = "DERP";
是函数中的局部变量现在指向内存中存储字符串常量"DERP"的不同位置(在编译时确定),而无需更改您在堆栈上分配的缓冲区,并且 main 中的缓冲区变量仍然指向它。
您尝试执行的操作可以按如下方式实现:
memcpy(buffer,"DERP",sizeof(char)*5); //5 and not 4 to include the null terminator
不可能按值传递 C 数组,但是可以C++数组 (std::
array) 和动态数组 (std::vector)。
#include <iostream>
#include <string.h>
using namespace std ;
void manipCharBuffer(char* buffer) {
strcpy(buffer,"DERP");
cout << "n string in called function "<<buffer;
}
int main() {
char buffer[256] = "JUNK STRING";
cout << " string before call is : " <<buffer;
char*p = buffer ;
manipCharBuffer(p);
cout << "n string after call is : " <<buffer;
return 0;
}
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?