理解C语言:指针参数内存传递的困惑与详解

需积分: 18 12 下载量 74 浏览量 更新于2024-08-08 收藏 655KB PDF 举报
在C语言中,理解指针参数如何传递内存是至关重要的。当函数接受一个指针作为参数时,它并不意味着函数会为该指针所指向的内存分配新的空间。例如,在示例7-4-1中,`GetMemory`函数试图通过指针`p`申请动态内存,但实际上,`str`参数在函数外部并没有改变,`str`依旧为`NULL`,因为`GetMemory`只是改变了`p`的值,并没有影响到函数外部的`str`。 在C/C++中,函数参数传递有三种方式:传值、传引用和传指针。对于指针参数,实际上是将指针本身的地址传递给函数,而不是它所指向的数据。这意味着函数不能直接修改指针所指向的原始内存,除非函数体内部也进行了相应的内存操作。如果函数想要改变指针所指向的内容,需要确保函数内部对指针进行了相应处理,比如动态分配内存或直接修改指针指向的内存。 在`GetMemory`函数中,虽然指针`p`被赋值了动态分配的内存地址,但由于是在函数内部进行的,这个内存并不是函数外部`str`指针所指向的。要使`str`指向新分配的内存,应该将`malloc`的结果赋值给`*str`(解引用后操作),而非`str`本身,如下所示: ```c void GetMemory(char p, int num) { *p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(&str, 100); // 将指针地址传递给GetMemory *str = NULL; // 或者在调用后立即赋值,让str指向新分配的内存 strcpy(*str, "hello"); // 正确使用指针指向的内存 } ``` 理解这一点对于避免内存泄漏和提高代码效率至关重要,因为过度的内存分配和释放可能导致程序性能下降,特别是在处理大型数据结构或频繁动态内存操作时。同时,了解何时使用`free`或`delete`释放动态内存,以及如何避免“野指针”(未初始化或者已被释放的指针)的使用,也是内存管理的基本原则之一。 掌握指针参数在C/C++中的传递机制,能够帮助程序员编写出更加高效和安全的代码。林锐博士的《高质量C++/C编程指南》提供了深入的指导,对于学习和实践这两种语言的开发者来说是一本宝贵的参考资料。