内存参考发送到双指针

时间:2017-06-17 18:11:50

标签: c++ pointers

所以我正在寻找有用的东西的澄清。我很确定我理解发生了什么,但在继续我的工作之前一定要确定。

我有一个定义如下的函数:

name* createName(char* firstName, char* lastName)
{
    name* newName = (name*)malloc(sizeof(name));

    initStringValue(&newName->firstName, firstName);
    initStringValue(&newName->lastName, lastName);

    newName->firstNameSize = strlen(newName->firstName);
    newName->lastNameSize = strlen(newName->lastName);

    return newName;
}

结构"名称"定义如下:

struct name 
{
    char* firstName;
    char* lastName;

    int firstNameSize;
    int lastNameSize;
};

负责名称字符串副本的另一个函数如下所示:

void initStringValue(char** destination, char* source)
{
    int length = strlen(source) + 1;
    int size = length * sizeof(char);
    *destination = (char*)malloc(size);
    memset(*destination, 0, size);
    strcpy(*destination, source);
}

如果我理解我在这里所做的事情,请使用&运算符我已经表示我希望不发送值而是发送其相关的内存地址。在诸如

之类的陈述中
&newName->firstName

其中struct member firstName是char *我表示我想发送这个指针的内存地址而不是指针值(这恰好是一个内存地址本身)。 - >运算符将此指针取消引用指针的成员,然后是& operator本质上将我们返回到firstName内存引用,允许我操作该内存引用的信息。

现在事情变得疯狂(无论如何对我来说)。为了实际使用该内存引用,我最终使用双重间接(因此非常被动的攻击性)。因为它跟随一个内存引用(比如& newName-> firstName)发送到一个char **,就像initStringValue函数中的char **目标一样,将是指针的指针,后者被分配给内存& newName-> firstName返回的引用。然后使用* destination I' m使用指向& newName-> firstName的内存引用的指针。或者换句话说,指针的第一个也是唯一一个成员是newName-> firstName。

的内存引用

我是否真的理解这一点?

1 个答案:

答案 0 :(得分:2)

  

我是否真的理解这一点?

阅读完您的描述后,我会说

我试着用一些例子来解释它。

如果你这样做:

void foo(int a)
{
    a = 5;
}

int main()
{
    int a = 10;
    foo(a);
    printf("%d\n", a);
    return 0;
}

您将获得输出:10

那是因为函数参数是函数的局部变量。换句话说 - 当函数返回时,对函数参数所做的任何更改都将丢失,即main中的变量不会更改。

如果你想要一个函数改变main中变量的值(也就是在调用者中),你必须传递一个指针。像:

void foo(int* a)  // notice int*
{
    *a = 5;       // notice *a
}

int main()
{
    int a = 10;
    foo(&a);       // notice &a
    printf("%d\n", a); 
    return 0;
}

这将输出:5

无论何种类型,这都是一般规则。我在示例中使用了int,但它也适用于任何类型 - 指针。

所以让我们用指针做一个例子:

void foo(char** a, int size)    // notice char**
{
    *a = malloc(32);            // malloc memory
    strcpy(*a, "Hello world");  // copy some data into the memory
}

int main()
{
    char* a = NULL;   // a is not pointing to anything yet
    foo(&a);
    // Now a points to the malloc'ed memory
    printf("%s\n", a);
    return 0;
}

这将输出:Hello world