我尝试初始化一个指针,指向一个指向char(char**)的指针:char arr[8]; char ** arrptr = &arr;我得到了警告:“从不兼容的指针类型初始化”这有什么不对?
char arr[8]; char ** arrptr = &arr;
anauzrmj1#
&arr返回一个char (*)[8],一个指向八个char的数组的指针。
&arr
char (*)[8]
char
char (*arrptr)[8] = &arr;
&( arr[0] )返回一个char *,一个字符指针。这个字符恰好是八个字符中的第一个,但是这个信息不是由类型传达的。
&( arr[0] )
char *
char *arrptr = &( arr[0] );
将数组视为指针会导致数组衰减为指向其第一个元素的指针。所以这可以简化为
char *arrptr = arr;
char**是指向一个指针的指针,被寻址的指针是指向char的指针。这可以如下实现:
char**
char *p1 = arr; char **p2 = &p1;
不清楚你需要什么,但可能是中间的那个。
nxowjjhe2#
当应用address-of运算符(&)时,数组不会衰减为指针。因此,将&应用于char[8]对象将返回指向char的8元素数组的指针:char(*)[8]。要将此对象转换为char**,您需要一个可以获取地址的char*对象。它可以通过一个helper变量来实现:
&
char[8]
char(*)[8]
char*
char arr[8]; char *tmp = arr; char **arrptr = &tmp;
或者使用C语言的C99修订版中引入的复合文字。
char arr[8]; char **arrptr = &(char*){ arr };
a8jjtwal3#
所以你有这个功能:
void sbprintf(char **buf, size_t *bufsize, const char * fmt, ...)
如果没有这个函数的文档,我们无法确定,但是使用char **buf, size_t *bufsize而不是char *buf, size_t bufsize的唯一解释是sbprintf分配缓冲区并通过参数返回它和它的大小(很像GNU的getline)。下面是它的使用方式:
char **buf, size_t *bufsize
char *buf, size_t bufsize
sbprintf
getline
char *buf = NULL; size_t bufsize = 0; sbprintf( &buf, &bufsize, "...", ... ); free( buf );
如果它类似于getline,它可以接受使用malloc分配的缓冲区,如果需要,它可以重新分配。这允许您使用相同的缓冲区重复调用sbprintf。
malloc
char *buf = NULL; size_t bufsize = 0; while ( ... ) { ... sbprintf( &buf, &bufsize, "...", ... ); ... } free( buf );
3条答案
按热度按时间anauzrmj1#
&arr
返回一个char (*)[8]
,一个指向八个char
的数组的指针。&( arr[0] )
返回一个char *
,一个字符指针。这个字符恰好是八个字符中的第一个,但是这个信息不是由类型传达的。
将数组视为指针会导致数组衰减为指向其第一个元素的指针。所以这可以简化为
char**
是指向一个指针的指针,被寻址的指针是指向char
的指针。这可以如下实现:不清楚你需要什么,但可能是中间的那个。
nxowjjhe2#
当应用address-of运算符(
&
)时,数组不会衰减为指针。因此,将&
应用于char[8]
对象将返回指向char
的8元素数组的指针:char(*)[8]
。要将此对象转换为
char**
,您需要一个可以获取地址的char*
对象。它可以通过一个helper变量来实现:或者使用C语言的C99修订版中引入的复合文字。
a8jjtwal3#
所以你有这个功能:
如果没有这个函数的文档,我们无法确定,但是使用
char **buf, size_t *bufsize
而不是char *buf, size_t bufsize
的唯一解释是sbprintf
分配缓冲区并通过参数返回它和它的大小(很像GNU的getline
)。下面是它的使用方式:
如果它类似于
getline
,它可以接受使用malloc
分配的缓冲区,如果需要,它可以重新分配。这允许您使用相同的缓冲区重复调用sbprintf
。