当前位置:  开发笔记 > 编程语言 > 正文

用于多级指针解引用?

如何解决《用于多级指针解引用?》经验,为你挑选了4个好方法。

什么时候使用任何语言的指针要求有人使用多个指针,让我们说一个三指针.什么时候使用三指针而不是只使用常规指针是有意义的?

例如:

char  * * *ptr;

代替

char *ptr;

SingleNegati.. 57

每个星应该被读作"指针指向"所以

char *foo;

是"指针foo指向的字符".然而

char *** foo;

是"指向指向指针foo的指针指向的字符".因此foo是一个指针.在该地址是第二个指针.在指向的地址是第三个指针.取消引用第三个指针会产生一个char.如果这就是它的全部内容,很难为此做出很多贡献.

不过,它仍然可以完成一些有用的工作.想象一下,我们正在编写bash或其他一些过程控制程序的替代品.我们希望以面向对象的方式管理流程的调用...

struct invocation {
    char* command; // command to invoke the subprocess
    char* path; // path to executable
    char** env; // environment variables passed to the subprocess
    ...
}

但是我们想要做一些奇特的事情.我们想要一种方法来浏览每个子进程看到的所有不同的环境变量集.为此,我们env将调用实例中的每组成员收集到一个数组中env_list,并将其传递给处理该数组的函数:

void browse_env(size_t envc, char*** env_list);

对不起,我不是英语,我几乎不理解句子_"指向指向指针foo的指针指向的字符"_.如果_"foo"_位于句子的末尾,那么句子不应该是_"指针指向**的字符**指向**BY**指针**指针foo"_? (4认同)


Constantino .. 11

如果你在C中使用"对象",你可能有这样的:

struct customer {
    char *name;
    char *address;
    int id;
} typedef Customer;

如果要创建对象,可以执行以下操作:

Customer *customer = malloc(sizeof Customer);
// Initialise state.

我们使用指向struct这里的指针,因为struct参数是通过值传递的,我们需要使用一个对象.(另外:Objective-C,一种面向对象的C语言包装语言,使用内部但可见的structs 指针.)

如果我需要存储多个对象,我使用一个数组:

Customer **customers = malloc(sizeof(Customer *) * 10);
int customerCount = 0;

由于C中的数组变量指向第一个项目,我再次使用指针.... 现在我有双指针.

但现在想象我有一个过滤数组并返回一个新数组的函数.但想象它不能通过返回机制,因为它必须返回错误代码 - 我的函数访问数据库.我需要通过引用参数来完成它.这是我的功能签名:

int filterRegisteredCustomers(Customer **unfilteredCustomers, Customer ***filteredCustomers, int unfilteredCount, int *filteredCount);

该函数接受一组客户并返回对一组客户(指向a的指针struct)的引用.它还需要客户数量并返回已过滤客户的数量(再次,按引用参数).

我可以这样称呼它:

Customer **result, int n = 0;
int errorCode = filterRegisteredCustomers(customers, &result, customerCount, &n);

我可以继续想象更多的情况......这个没有typedef:

int fetchCustomerMatrix(struct customer ****outMatrix, int *rows, int *columns);

显然,我会成为一个可怕的和/或虐待狂的开发者.所以,使用:

typedef Customer *CustomerArray;
typedef CustomerArray *CustomerMatrix;

我可以这样做:

int fetchCustomerMatrix(CustomerMatrix *outMatrix, int *rows, int *columns);

如果您的应用程序在每个级别使用矩阵的酒店中使用,您可能需要一个矩阵阵列:

int fetchHotel(struct customer *****hotel, int *rows, int *columns, int *levels);

或者就是这样:

typedef CustomerMatrix *Hotel;
int fetchHotel(Hotel *hotel, int *rows, int *columns, int *levels);

不要让我开始在一系列酒店:

int fetchHotels(struct customer ******hotels, int *rows, int *columns, int *levels, int *hotels);

...安排在一个矩阵(某种大型酒店公司?):

int fetchHotelMatrix(struct customer *******hotelMatrix, int *rows, int *columns, int *levels, int *hotelRows, int *hotelColumns);

我想说的是你可以想象多个间接的疯狂应用.只要确保你使用typedef,如果多指针是一个好主意,你决定使用它们.

(此帖子是否算作SevenStarDeveloper的申请?)



1> SingleNegati..:

每个星应该被读作"指针指向"所以

char *foo;

是"指针foo指向的字符".然而

char *** foo;

是"指向指向指针foo的指针指向的字符".因此foo是一个指针.在该地址是第二个指针.在指向的地址是第三个指针.取消引用第三个指针会产生一个char.如果这就是它的全部内容,很难为此做出很多贡献.

不过,它仍然可以完成一些有用的工作.想象一下,我们正在编写bash或其他一些过程控制程序的替代品.我们希望以面向对象的方式管理流程的调用...

struct invocation {
    char* command; // command to invoke the subprocess
    char* path; // path to executable
    char** env; // environment variables passed to the subprocess
    ...
}

但是我们想要做一些奇特的事情.我们想要一种方法来浏览每个子进程看到的所有不同的环境变量集.为此,我们env将调用实例中的每组成员收集到一个数组中env_list,并将其传递给处理该数组的函数:

void browse_env(size_t envc, char*** env_list);


对不起,我不是英语,我几乎不理解句子_"指向指向指针foo的指针指向的字符"_.如果_"foo"_位于句子的末尾,那么句子不应该是_"指针指向**的字符**指向**BY**指针**指针foo"_?

2> Constantino ..:

如果你在C中使用"对象",你可能有这样的:

struct customer {
    char *name;
    char *address;
    int id;
} typedef Customer;

如果要创建对象,可以执行以下操作:

Customer *customer = malloc(sizeof Customer);
// Initialise state.

我们使用指向struct这里的指针,因为struct参数是通过值传递的,我们需要使用一个对象.(另外:Objective-C,一种面向对象的C语言包装语言,使用内部但可见的structs 指针.)

如果我需要存储多个对象,我使用一个数组:

Customer **customers = malloc(sizeof(Customer *) * 10);
int customerCount = 0;

由于C中的数组变量指向第一个项目,我再次使用指针.... 现在我有双指针.

但现在想象我有一个过滤数组并返回一个新数组的函数.但想象它不能通过返回机制,因为它必须返回错误代码 - 我的函数访问数据库.我需要通过引用参数来完成它.这是我的功能签名:

int filterRegisteredCustomers(Customer **unfilteredCustomers, Customer ***filteredCustomers, int unfilteredCount, int *filteredCount);

该函数接受一组客户并返回对一组客户(指向a的指针struct)的引用.它还需要客户数量并返回已过滤客户的数量(再次,按引用参数).

我可以这样称呼它:

Customer **result, int n = 0;
int errorCode = filterRegisteredCustomers(customers, &result, customerCount, &n);

我可以继续想象更多的情况......这个没有typedef:

int fetchCustomerMatrix(struct customer ****outMatrix, int *rows, int *columns);

显然,我会成为一个可怕的和/或虐待狂的开发者.所以,使用:

typedef Customer *CustomerArray;
typedef CustomerArray *CustomerMatrix;

我可以这样做:

int fetchCustomerMatrix(CustomerMatrix *outMatrix, int *rows, int *columns);

如果您的应用程序在每个级别使用矩阵的酒店中使用,您可能需要一个矩阵阵列:

int fetchHotel(struct customer *****hotel, int *rows, int *columns, int *levels);

或者就是这样:

typedef CustomerMatrix *Hotel;
int fetchHotel(Hotel *hotel, int *rows, int *columns, int *levels);

不要让我开始在一系列酒店:

int fetchHotels(struct customer ******hotels, int *rows, int *columns, int *levels, int *hotels);

...安排在一个矩阵(某种大型酒店公司?):

int fetchHotelMatrix(struct customer *******hotelMatrix, int *rows, int *columns, int *levels, int *hotelRows, int *hotelColumns);

我想说的是你可以想象多个间接的疯狂应用.只要确保你使用typedef,如果多指针是一个好主意,你决定使用它们.

(此帖子是否算作SevenStarDeveloper的申请?)



3> Brian R. Bon..:

指针只是一个保存内存地址的变量.

因此,当您想要保存指针变量的地址时,可以使用指向指针的指针.

如果你想返回一个指针,并且你已经在使用返回变量,那么你将传入一个指针的地址.然后该函数取消引用此指针,以便它可以设置指针值.即该函数的参数将是指向指针的指针.

多级间接也用于多维数组.如果要返回二维数组,可以使用三重指针.当将它们用于多维数组时,尽管在遍历每个间接层时都要小心地进行正确投射.

以下是通过参数返回指针值的示例:

//Not a very useful example, but shows what I mean...
bool getOffsetBy3Pointer(const char *pInput, char **pOutput)
{
  *pOutput = pInput + 3;
  return true;
}

你这样称呼这个函数:

const char *p = "hi you";
char *pYou;
bool bSuccess = getOffsetBy3Pointer(p, &pYou);
assert(!stricmp(pYou, "you"));



4> René Nyffene..:

ImageMagicks的Wand有一个声明为的函数

WandExport char* * * * * * DrawGetVectorGraphics    (  const DrawingWand  *) 

我不是这样做的.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有