【发布时间】:2014-07-22 14:33:11
【问题描述】:
我试图更多地理解 C 中的 char 指针,但有一件事让我明白了。
假设我想将一个 char 指针传递给一个函数并更改指针所代表的值。示例如下:
int Foo (char *(&Msg1), char* Msg2, char* Msg3){
char *MsgT = (char*)malloc(sizeof(char)*60);
strcpy(MsgT,"Foo - TEST");
Msg1 = MsgT; // Copy address to pointer
strcpy(Msg2,MsgT); // Copy string to char array
strcpy(Msg3,MsgT); // Copy string to char pointer
return 0;
}
int main() {
char* Msg1; // Initial char pointer
char Msg2[10]; // Initial char array
char* Msg3 = (char*)malloc(sizeof(char) * 10); // Preallocate pointer memory
Foo(Msg1, Msg2, Msg3);
printf("Msg1: %s\n",Msg1); // Method 1
printf("Msg2: %s\n",Msg2); // Method 2
printf("Msg3: %s\n",Msg3); // Method 3
free(Msg1);
free(Msg3);
return 0;
}
在上面的例子中,我列出了所有我知道的将 char 指针传递给函数的工作方法。我不明白的是方法1。
char *(&Msg1)对于传递给函数Foo的第一个参数是什么意思?
此外,method 2 和 method3 似乎被书籍和教程广泛介绍,其中一些甚至将这些方法称为最正确的方法传递数组/指针。我想知道 方法 1 对我来说看起来很不错,尤其是当我编写我的 API 时,用户可以轻松地将空指针传递给函数,而无需预先分配内存。如果用户忘记释放内存块,唯一的缺点可能是潜在的内存泄漏(与 方法 3 相同)。有什么理由我们应该更喜欢使用 方法 2 或 3 而不是 方法 3?
【问题讨论】:
-
你在什么地方看到过这个例子吗?常用
char **Msg1代替char *(&Msg1)。 -
不幸的是,这是我很久以前记的笔记。我什至不记得我从哪里得到这个。我了解
**Msg1的工作原理,但它们是不同的,对吧? -
char *(&Msg1)是 C++ 引用传递。 -
同时学习 C 和 C++ 不是一个好主意! 它们非常相似,以至于您可能认为它们非常不同的地方并不重要。
-
@StevenChang 它不能用 ac 编译器编译,但用 C++ 编译器编译得很好,在 C 中它被认为是语法错误,而在 C++ 中,它被认为是reference,如果你不这样做了解参考文献,您应该阅读更多关于它们的信息
标签: c++ c pointers char char-pointer