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

来源:互联网 发布:人工智能战胜人类 编辑:程序博客网 时间:2024/05/21 09:57

《高质量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了

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

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

应该改为:

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以后已经指向是一个新的值了
函数跑完后,变的是这这个指针的拷贝,而不是传进来的指针
加个引用其实就很好理解了

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

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

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

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

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

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

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

原创粉丝点击