的类型test2是char *。因此,类型&test2将char **是与参数的类型兼容x的printchar()。
的类型test是char [256]。因此,类型&test将char (*)[256]是不带参数的类型兼容x的printchar()。
让我告诉你在地址方面的差异test和test2。
#include <stdio.h>
#include <stdlib.h>
static void printchar(char **x)
{
printf("x = %p\n", (void*)x);
printf("*x = %p\n", (void*)(*x));
printf("Test: %c\n", (*x)[0]);
}
int main(int argc, char *argv[])
{
char test[256];
char *test2 = malloc(256);
test[0] = 'B';
test2[0] = 'A';
printf ("test2 : %p\n", (void*)test2);
printf ("&test2 : %p\n", (void*)&test2);
printf ("&test2[0] : %p\n", (void*)&test2[0]);
printchar(&test2); // works
printf ("\n");
printf ("test : %p\n", (void*)test);
printf ("&test : %p\n", (void*)&test);
printf ("&test[0] : %p\n", (void*)&test[0]);
// Commenting below statement
//printchar((char **) &test); // crashes because *x in printchar() has an invalid pointer
free(test2);
return 0;
}
输出:
$ ./a.out
test2 : 0x7fe974c02970
&test2 : 0x7ffee82eb9e8
&test2[0] : 0x7fe974c02970
x = 0x7ffee82eb9e8
*x = 0x7fe974c02970
Test: A
test : 0x7ffee82eba00
&test : 0x7ffee82eba00
&test[0] : 0x7ffee82eba00
指向此处注意:
的输出(存储器地址)test2和&test2[0]是数字相同,并且它们的类型也是相同的,其是char *。
但是test2和&test2是不同的地址,它们的类型也不同。
的类型test2是char *。
的类型&test2是char **。
x = &test2
*x = test2
(*x)[0] = test2[0]
的输出(存储地址)test,&test并且&test[0]是数字相同但它们的类型是不同的。
的类型test是char [256]。
的类型&test是char (*) [256]。
的类型&test[0]是char *。
如输出所示&test与相同&test[0]。
x = &test[0]
*x = test[0] //first element of test array which is 'B'
(*x)[0] = ('B')[0] // Not a valid statement
因此,您会遇到细分错误。
char (*)[256]给char**呢?