指向数组指针的指针 (char** arrptr = &arr)

问题描述 投票:0回答:3

我尝试初始化一个指向 char (char**) 的指针:

char arr[8]; char ** arrptr = &arr;

我收到警告: “从不兼容的指针类型初始化”

这有什么问题吗?

arrays c pointers
3个回答
1
投票

&arr
返回一个
char (*)[8]
,一个指向八个
char
数组的指针。

char (*arrptr)[8] = &arr;

&( arr[0] )
返回
char *
,指向字符的指针。

该角色恰好是八个角色中的第一个,但该信息不是通过类型传达的。

char *arrptr = &( arr[0] );

将数组视为指针会导致数组衰减为指向其第一个元素的点。所以这可以简化为

char *arrptr = arr;

A

char**
是指向指针的指针,寻址指针是指向
char
的指针。这可以通过以下方式实现:

char *p1 = arr;
char **p2 = &p1;

不清楚你需要什么,但可能是中间的。


0
投票

应用地址运算符 (

&
) 时,数组不会衰减为指针。因此,应用于
&
对象的
char[8]
返回指向
char
的 8 元素数组的指针:
char(*)[8]
.

要将此对象转换为

char**
,您需要一个可以获取地址的
char*
对象。可以使用辅助变量来实现:

char arr[8];
char *tmp = arr;
char **arrptr = &tmp;

或者使用 C 语言的 C99 修订版中引入的复合文字。

char arr[8];

char **arrptr = &(char*){ arr };

0
投票

在评论中,您提供

void sbprintf(char **buf, size_t *bufsize, const char * fmt, ...)

我猜这个函数与 GNU 的

getline
是一样的,一个分配内存并通过命令行参数返回指向该内存的指针的函数。

使用方法如下:

char *buf = NULL;
size_t bufsize = 0;

sbprintf( &buf, &bufsize, "...", ... );

free( buf );

如果它像

getline
,它可以接受使用
malloc
分配的缓冲区,允许您使用仅在需要时替换的相同缓冲区重复调用它。

char *buf = NULL;
size_t bufsize = 0;

while ( ... ) {
   ...

   sbprintf( &buf, &bufsize, "...", ... );

   ...
}

free( buf );

不过,我发现它返回

void
很奇怪。它如何发出错误信号???

© www.soinside.com 2019 - 2024. All rights reserved.