如果这是一个简单的错误,请原谅我,但我目前正在学习 C,我只是做了一个简单的程序来掌握指针。
我有一段简单的代码可以产生我期望的输出
int x = 4;
int *p;
p = &x;
printf("%d\n\n",*p);
//output is 4 as expected
但是当我尝试对 char 数组执行相同操作时,即使我遵循相同的逻辑...
char x[] = "Hello, Stack Overflow!";
char *p[];
p = &x;
printf("%s\n\n",*p);
//this gives me an error when compiling as follows
//
// run.c:15: error: incompatible types when assigning to type ‘char *[1]’ from type ‘char (*)[23]’
最佳答案
多个错误。首先,char *p[]
没有声明一个指向数组的指针(正如您认为的那样)——它声明了一个 char 指针数组。
其次,由于 x
是一个数组,&x
将计算为与 x
相同的数值(因为数组不能按值传递,仅通过指针,它们在传递给函数时会衰减为指针)。你需要做的是
const char *x = "Hello SO!";
const char **p = &x;
printf("%s\n", *p);
这是一个简单的解决方案(使字符串文字,即 char
的数组,衰减为指针)。还有另一种解决方案需要更多思考。从编译错误信息可以看出&x
的类型是char(*)[]
。所以你必须在这里声明一个指向数组的指针:
char x[] = "Hello SO!"; // x is a char array
char (*p)[] = &x; // p is a pointer to a char array
printf("%s\n", *p); // printf accesses *p, so it prints the underlying char array - correct!
关于无法理解为什么 C 指针不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12764411/