【问题标题】:Use of triple pointer over double pointer when only reading value of double pointer?仅读取双指针的值时在双指针上使用三指针?
【发布时间】:2021-12-16 14:30:58
【问题描述】:

此代码仅看起来像这样,因为在赋值中禁止使用结构和全局变量。

无论哪种方式都可以,但我想知道是否只使用双指针会重新分配指针的临时副本。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void allocateData(char ***dptrArrayData, int *intArraySize)
{
    *dptrArrayData = (char**)malloc(*intArraySize*sizeof(char*));
    for (int i = 0; i < *intArraySize; i++)
    {
        (*dptrArrayData)[i] = (char*)malloc(12*sizeof(char));
        (*dptrArrayData)[i] = "Lorem Ipsum";
    }
}

void printDataDoublePointer(char **dptrArrayData, int intArraySize)
{
    for (int i = 0; i < intArraySize; i++)
    {
        printf("Text:%s at index:%d\n",dptrArrayData[i],i);
    }
}

void printDataTriplePointer(char ***dptrArrayData, int *intArraySize)
{
    for (int i = 0; i < *intArraySize; i++)
    {
        printf("Text:%s at index:%d\n",(*dptrArrayData)[i],i);
    }
}
int main()
{
    char **dptrArrayData;
    int intArraySize = 5;
    allocateData(&dptrArrayData,&intArraySize);
    printDataDoublePointer(dptrArrayData,intArraySize);
    printDataTriplePointer(&dptrArrayData,&intArraySize);
    return 0;
}

【问题讨论】:

  • 函数参数需要比它正在更新的变量多一个*
  • 您可以使用char ** 返回值而不是char *** 参数。
  • 问题不是关于更新,遗憾的是我不能使用返回值,因为我将在一个函数中返回许多数组,问题是使用双指针仅读取是否与使用三元组相同指针。
  • 它是关于什么的? allocateData()需要更新变量dptrArrayData,所以需要char ***。其他函数不更新任何东西,所以他们可以使用char **
  • 所以当我只传入双指针时,它不会创建要读取的数组的临时副本吗?因为如果我更新双指针中的某些内容,则值将保持在范围内。编辑:我是 c 的菜鸟,我只知道 oop ......

标签: arrays c string pointers double-pointer


【解决方案1】:

无论哪种方式都可以,但我想知道是否只使用双指针会重新分配指针的临时副本。

我带你去问一下两者的区别

void printDataDoublePointer(char **dptrArrayData, int intArraySize)

void printDataTriplePointer(char ***dptrArrayData, int *intArraySize)

。在每种情况下,函数都会接收调用者提供的所有参数值的副本。这就是按值传递语义的本质,这是 C 提供的唯一函数调用语义。

但不涉及重新分配。当指针作为函数参数传递时,只复制指针,而不复制它指向的对象。该函数接收一个独立指针,指向原始指向的同一对象。

【讨论】:

  • 谢谢,我不知道,也许他们应该在学校告诉我们哈哈
  • 就在名称中:“指针”。它只是指向其他事物的事物,而不是事物本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多