如何通过带有指针的函数传递 char 变量(示例已发送)?
Posted
技术标签:
【中文标题】如何通过带有指针的函数传递 char 变量(示例已发送)?【英文标题】:how to pass char variable thorough a function with pointers(example already sent)? 【发布时间】:2019-09-04 08:02:39 【问题描述】:我正在练习 C++,这段代码应该将一个数组复制到另一个数组。输出类型是字符,它是通过函数“f”通过指针传递的。我的输出类型是指向 char 数组的指针。这是我的代码:
using namespace std;
void f(char*, char*);
int main()
char *a1;
char a2[] = "1234";
f(a1, a2);
cout << a1<< endl;
return 0;
void f(char *a, char *b)
int len;
len = sizeof(b) / sizeof(b[0]);
a = new char[len];
for (; (*a=*b )!= '\0'; a++, b++)
cout<<*a<<endl;
for (int i=0;i<4;i++)
cout<<a[i]<<endl;
-
在函数中每次for循环运行'a'元素更改为不可读的值。起初,它显示正确的价值,然后改变。例如,在函数内的第一个循环中,它会打印正确的 'a' 值,但在第二个循环中它会无缘无故地更改它!
此函数不返回任何值。正如我所期望的那样,通过指针调用它必须更改变量但没有任何反应。
深入的解释表示赞赏。我是 C++ 编程的新手。
【问题讨论】:
内联 9th 它的 cout 如果您完全不熟悉 C++ 和一般编程,建议使用std::vector
(或者在这种情况下更确切地说是 std::string
)而不是原始手动分配的数组。很少有理由使用手动内存分配。
sizeof char* array in C/C++的可能重复
这里有几个错误,如果你开始练习“真正的”(又名现代)C++ 而不是 C,所有这些都可以避免。简而言之:停止使用 char*
处理字符串并开始使用 @987654326 @ 反而。复制它们就像复制int
一样简单。
您能告诉我这里的错误或纠正它们吗?我正在关注一个教程,我稍微更改了代码。但现在我很困惑。你的意思是我不应该使用 char*?为什么?
【参考方案1】:
在不改变代码基本风格的情况下,这里是一个固定版本,带有 cmets:
#include <iostream>
using namespace std;
void f(char**, char*); // You need to pass a pointer to the pointer!
void f2(char*&, char*); // Alternative passing the pointer by reference
int main()
char* a1;
char a2[] = "1234";
// f(&a1, a2); // Pass the address of the 'a1' pointer
f2(a1, a2); // a1 pointer is now passed by reference
cout << a1 << endl;
delete a1[]; // Here, we free the memory allocated by the new call!
return 0;
void f(char** a, char* b)
int len;
// len = sizeof(b) / sizeof(b[0]); // You can't get the array length like this!
len = strlen(b); // Assuming your string is null-terminate!
*a = new char[len + 1]; // Make room for the null terminator!
// Make a copy of the pointer (atemp) - otherwise you are changing the address of the new character
// array you just created - and this will then fail in the 2nd loop ...
for (char* atemp = *a; (*atemp = *b) != '\0'; atemp++, b++)
cout << *atemp << endl;
for (int i = 0; i < len; i++) // Length won't always be 4!
// for (int i = 0; i < 4; i++)
cout << (*a)[i] << endl;
void f2(char*& a, char* b)
size_t len = strlen(b); // Assuming your string is null-terminate!
a = new char[len + 1];
for (char* atemp = a; (*atemp = *b) != '\0'; atemp++, b++)
cout << *atemp << endl;
for (int i = 0; i < len; i++) // Length won't always be 4!
cout << a[i] << endl;
请随时询问有关为什么进行更改的更多详细信息!
编辑:添加了使用参数作为参考的替代方法。
【讨论】:
顺便说一句,我同意这里的许多 cmets 关于“坏风格”的观点。但是,这是一个正在探索 C/C++ 工作原理的初学者,所以让我们尝试提供帮助,并指出错误以及错误的原因。这称为学习/教学。 谢谢回答,你通过了这个变量。不能用指针传递变量吗?你用了'&' ..我的问题是为什么这段代码有效?main()char *s1;char *s2="ali";f1(s1,s2);cout @HamidReza&
在 C++ 中具有多种含义,具体取决于上下文。因为在这种情况下它不是类型名称的一部分,所以它表示take the address of the variable
。它与 C++ 引用无关,在没有引用的 C 中也一样。你的教程之前应该已经介绍过了。
@Hamid Reza - 是的,您可以使用指针的 reference 来代替指向它的指针!只是不确定您是否遇到过参考参数。事实上,引用使代码更简单一些(但它可能编译成非常相似的代码)。
@HamidReza 该代码不起作用。不会出现编译错误(但可能是警告),但它会导致未定义的行为,因为您在 f
中使用了未初始化(不确定)的 s1
值,甚至取消了它的引用。如果它碰巧打印了一些东西,那纯属巧合。【参考方案2】:
你的程序中有很多错误:
void f(char *a, char *b)
len = sizeof(b) / sizeof(b[0]);
b
是指向 char 的指针。因为它具有机器类型的指针大小,通常是 32 位或 64 位。所以你永远不会得到数组的大小!
如果你真的想将一个指向 char 的原始指针传递给一个函数并想要处理存储在指针指向的位置的数据,你要么也传递大小(元素的数量),要么你必须知道一个结束标记。如果是 c-sytle 字符串,则在字符串末尾有一个 '\0',这使得使用它成为可能。
所以你必须首先计算元素的数量,直到达到 '\0',分配一个新数组,复制元素,然后返回指针。
下一次失败:如果你用new
分配内存,你必须稍后在你的程序中使用delete
。
但是:
你所做的是糟糕的 sytle C 代码!它实际上与 C++ 和好的 C 无关。无需编写自己的字符串复制函数,因为已经有 strcpy
和 strlen
来获取大小。
在 C++ 中,您的代码可能是这样的:
void f( const std::string& src, std::string& target )
target = src;
int main()
std::string a2"abcd";
std::string a1;
f( a2, a1 );
std::cout << a1 << std::endl;
【讨论】:
我认为当我们在函数中定义一个变量时,它不需要被删除。因为他们是本地人。那么,我怎样才能删除我定位到它的内存的函数变量呢?如果我在函数中删除它,它不会返回任何输出。 @HamidReza 函数中定义的变量会被自动删除,对吧!但这只是指针,而不是手动分配的内存,地址是 iStop 通过 EndlessLoopBreakern 存储的那个指针!所以你必须删除你分配的内存,而不是指向那个内存的指针。以上是关于如何通过带有指针的函数传递 char 变量(示例已发送)?的主要内容,如果未能解决你的问题,请参考以下文章