请原谅我这是一个简单的错误,但我现在只是学习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]’
答案 0 :(得分:2)
多个错误。首先,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!
答案 1 :(得分:2)
要创建指向数组的指针,必须明确说明,因为下标运算符优先于解除引用运算符。
char x[] = "Hello, there";
char (*p)[sizeof(x)/sizeof(*x)] = &x;
您在这里说的是首先解除引用,然后应用下标(*p)[i]
必须产生char
。正如其他人所说,你的代码声明了一个指向char
的指针的数组。
答案 2 :(得分:1)
char *p[]
表示p是一个字符指针数组,而不是指向数组的指针。你应该保持p char *p
,然后它就会起作用。
答案 3 :(得分:1)
将char *p[]
更改为char p[]
或char *p
。 char *p[]
等于char **p
。
答案 4 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char x[] = "Hello, Stack Overflow!";
char *p;
int len = strlen(x);
p = malloc(len * sizeof(char) +1);
strcpy(p,x);
printf("%s\n\n",p);
return 0;
}
答案 5 :(得分:-1)
x
这里是一个指针(指向数组第一个元素的指针)。如果只放置char *p
和p = x
,它应该有效。