无法理解为什么 C 指针不起作用

标签 c pointers

如果这是一个简单的错误,请原谅我,但我目前正在学习 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/

相关文章:

c - 传递指针的值

c - 指针的增量与整数的增量不一样吗?

c - 如何使用动态分配代替静态int?

c - C 中的整数提升会降级 `long int` 吗?

c - 多线程程序中的fork()

c - 有没有办法使用 C 中的 strcmp 比较两个不同长度的字符串

C 指向数组/指针数组的指针消歧

c - 结构体 C 中的 sizeof 数组

c - 程序执行期间的变量值

c - 指向指针取消引用的指针