4

如果这是一个简单的错误,请原谅我,但我现在只是在学习 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]’
4

6 回答 6

2

要创建指向数组的指针,您必须明确说明,因为下标运算符优先于解引用运算符。

char x[] = "Hello, there";
char (*p)[sizeof(x)/sizeof(*x)] = &x;

您在这里所说的是,首先取消引用然后应用下标(*p)[i]必须产生一个char. 正如其他人所说,您的代码声明了一个指向char.

于 2012-10-06T22:38:18.123 回答
2

多个错误。首先,char *p[]不声明指向数组的指针(如您所想的那样)-而是声明了一个 char 指针数组。

其次,因为x是一个数组,&x将评估为相同的数值x(由于数组不能按值传递,只能通过指针传递,它们在传递给函数时会衰减为指针)。你需要做的是

const char *x = "Hello SO!";
const char **p = &x;
printf("%s\n", *p);

这是一个简单的解决方案(使字符串文字,即chars 的数组,衰减为指针)。还有另一种解决方案需要更多思考。从编译器错误信息中,可以看到类型&xchar (*)[]. 所以你必须在这里声明的是一个指向数组的指针:

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!
于 2012-10-06T22:27:18.417 回答
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;
}
于 2012-10-06T22:34:07.273 回答
1

char *p[]表示 p 是字符指针数组,而不是指向数组的指针。您应该保留 p char *p,然后它会起作用。

于 2012-10-06T22:24:45.727 回答
1

更改char *p[]char p[]char *pchar *p[]等于char **p

于 2012-10-06T22:25:38.440 回答
-1

x这里是一个本身的指针(指向数组第一个元素的指针)。如果你只放char *pand p = x,它应该可以工作。

于 2012-10-06T22:27:51.460 回答