我想创建一个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
没有改变缓冲区?就好像它在函数内部仍然只有局部范围。
答案 0 :(得分:2)
这是对正在发生的事情的现实世界类比。我在一张纸上写下我的电话号码。我给你一张那张纸的副本。在副本上,您删除我的号码并编写自己的号码。然后你拨打刚写的号码。
答案 1 :(得分:2)
在此功能内:
void manipCharBuffer(char* buffer) {
buffer = "DERP";
名称buffer
与buffer
中main
的名称不同。为避免混淆,您可以使用不同的变量名称,例如:
void manipCharBuffer(char* p_buffer) {
p_buffer = "DERP";
希望这清楚地表明为什么main
在这里没有任何区别。您正在将本地指针p_buffer
设置为指向不同的char数组。 ("DERP"
是一个位于内存中的char数组。)
如果要将字符从一个char数组复制到另一个char数组,则必须编写复制字符的代码;一种方法是:
std::strcpy( p_buffer, "DERP" );
答案 2 :(得分:0)
在main函数中,变量缓冲区指向堆栈上分配的256个字符的数组。将其发送到函数manipCharBuffer时,地址将按值传输。这意味着每次调用函数manipCharBuffer都会创建一个名为buffer的局部变量,该变量存储在内存中与main函数中的变量缓冲区不同的位置,但它们都指向内存中的相同位置。所以行的结果是:
buffer = "DERP";
是函数中的局部变量现在指向内存中的不同位置,其中存储字符串常量“DERP”(在编译时确定),而不更改在堆栈上分配的缓冲区,以及缓冲区变量in主要仍指向它。
您尝试做的事情可以通过以下方式实现:
memcpy(buffer,"DERP",sizeof(char)*5); //5 and not 4 to include the null terminator
答案 3 :(得分:0)
不可能按值传递C数组,但是C ++数组(std :: array)和动态数组(std :: vector)是可能的。如果你想使用c ++,最好使用标准库
#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;
}