传递一个指针进去用(指针不能被修改)*p;

高质量C++编程》中的一个例子,程序代码如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void GetMemory(char* p)
{
    p = (char *)malloc(100);
}

void main(void)
{
    char* str = NULL;
    GetMemory (str);
    strcpy(str, "hello world/n");
    printf(str);
}

请问运行Test 函数会有什么样的结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。

但是我还是没有想明白,既然在main中GetMemory函数入口参数是一个指针,那么str指针作为参数应该是被作为“指针传递”而不是“值传递”

那么在GetMemory函数中str指针应该能够得到初始化,但为什么在GetMemory函数退出后,str指针的值却还原为NULL了

百思不得其解,望各位拍转拍醒我吧,谢谢!

=========================================

应该改为:

我是这样理解的
你传了个指针进来,其实是传递了一份拷贝
这份地址拷贝通过new以后已经指向是一个新的值了
函数跑完后,变的是这这个指针的拷贝,而不是传进来的指针
加个引用其实就很好理解了

===============================================

传指针可以改变指针所指向的那块内存的内容。而为指针分配内存,是让指针指向一块合法的内存,改变指

针本身所含的内容(地址)。达到这个目的,传递的只要是指针的指针才可以。

================================================

是否可以这样说:
传递一个指针进去用(指针不能被修改)*p;
而返回一个指针要用**p;

CODE:
void GetMemory(char** p)
{
    *p = (char *)malloc(100);
}

int main(void)
{
    char* str = NULL;
    GetMemory (&str);
    strcpy(str, "hello world/n");
    printf(str);

        return 0;
}

指针也是值,本质上任何函数传递都是值传递,只不过传递指针的值的时候指针的值是"地址",你去好好体会一下吧 我是这样理解的
你传了个指针进来,其实是传递了一份拷贝
这份地址拷贝通过new以后已经指向是一个新的值了
函数跑完后,变的是这这个指针的拷贝,而不是传进来的指针
加个引用其实就很好理解了

### 使用结构体指针的二重指针 当涉及到结构体指针时,如果需要在函数内动态分配内存并希望这些变化反映到外部作用域,则需传递指向该结构体指针指针,也就是所谓的二重指针。这样做是因为直接传递结构体指针仅能改变其所指向的内容而无法更改其本身所指向的位置。通过使用二重指针可以在被调用者中创建新的对象并将这个新位置赋值回给调用者的原始指针变量。 下面是一个简单的例子来展示如何利用二重指针处理结构体: ```c #include <stdio.h> #include <stdlib.h> // 定义一个简单结构体 typedef struct { int value; } MyStruct; void allocate(MyStruct **ptr) { // 动态分配内存,并更新入的指针使其指向这块新分配的空间 (*ptr) = (MyStruct *)malloc(sizeof(MyStruct)); if ((*ptr) != NULL) { (*ptr)->value = 10; // 初始化成员数据 } } int main() { MyStruct *myPtr = NULL; printf("Before allocation, myPtr is %p\n", (void*)myPtr); allocate(&myPtr); // 将地址&myPtr传递进去以便于修改它实际存储的数据 if (myPtr != NULL){ printf("After allocation and initialization, the value of myPtr->value is %d\n", myPtr->value); free(myPtr); // 记得释放之前申请过的资源 } return 0; } ``` 上述程序展示了如何定义以及初始化一个结构体类型的二重指针[^1]。`allocate()` 函数接收 `MyStruct` 类型的一个双星号参数 (`MyStruct **`) ,这允许此函数能够改变主函数中的 `myPtr` 所指向的对象。注意这里是如何解引用两次以访问最终的目标结构体实例及其字段[^2]。 对于更复杂的场景比如管理多个同类型结构体组成的集合时,可能会遇到像 `[videoindex]` 这样的索引操作符用于遍历或定位特定项的情况[^3]。不过在这个基础示例里并没有涉及这部分逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值