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 *p[]配列へのポインタを宣言しません(あなたが思うように)-むしろcharポインタの配列を宣言します。

次に、xは配列である&xため、と同じ数値に評価されますx(配列は値で渡すことはできず、ポインターでのみ渡すことができるため、関数に渡されるとポインターに減衰します)。あなたがする必要があるのはむしろ

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

これは簡単な解決策です(文字列リテラル、つまりcharsの配列をポインタに減衰させます)。もう少し考える必要がある別の解決策があります。&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!
于 2012-10-06T22:27:18.417 に答える
2

配列へのポインタを作成するには、添え字演算子が間接参照演算子よりも優先されるため、明示的に指定する必要があります。

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

ここで言っているのは、最初に間接参照してから添え字(*p)[i]適用すると、が生成される必要があるということcharです。他の人が述べているように、あなたのコードはへのポインタへの配列を宣言しますchar

于 2012-10-06T22:38:18.123 に答える
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
#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

xこれは、それ自体のポインター(配列の最初の要素へのポインター)です。char *pとだけ入れればうまくp = xいくはずです。

于 2012-10-06T22:27:51.460 に答える