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

时间:2012-10-06 22:22:51

标签: 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]’

6 个答案:

答案 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 *pchar *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 *pp = x,它应该有效。