(* ptr)[10]是什么意思?

时间:2012-10-05 04:59:07

标签: c arrays pointers

void main()
{
    int (*d)[10];
    d[0] = 7;
    d[1]=10;
    printf("%d\n",*d);
}

它应该打印10但编译器显示如下错误:

  

test.c:4:7:错误:从类型'int'分配类型'int [10]'时出现不兼容的类型

请注意,我添加了一些错误,而不是全部。

5 个答案:

答案 0 :(得分:6)

如chris所述,d数组指针。这意味着您在访问变量时不正确地使用变量,但除非您指定d指向有效数组,否则您将访问随机存储器。

按如下方式更改您的计划:

int main(void)
{
    int (*d)[10];  /* A pointer to an array */
    int a[10];     /* The actual array */

    d = &a;  /* Make `d` point to `a` */

    /* Use the pointer dereference operator (unary prefix `*`)
       to access the actual array `d` points to */
    (*d)[0] = 7;
    (*d)[1] = 10;

    /* Double dereference is okay to access the first element of the
       arrat `d` points to */
    printf("%d\n", **d);

    return 0;
}

答案 1 :(得分:1)

在C中,[]与*,指针语法相同。因此以下几行是相同的:

int** array2d1;
int* array2d2[];
int array2d3[][];

为了与更近的例子相关,主要功能具有以下流行形式:

int main(int argc, char** argv){ ... }

int main(int argc, char* argv[]){ ... }

因此

int (*d)[10]

相同
int* d[10]

相同
int** d;
int firstArray[10];
d = &firstArray;

实际上,您正在创建指向指针(指向数组的指针)的指针,并将第一个指针分配给10个元素的数组。因此,当您运行以下行时:

d[0] = 7;
d[1] = 10;

您正在将第一个数组的地址分配给7,将第二个数组的地址分配给10.因此,正如Joachim所提到的,要分配值,您需要遵循两次:

(*d)[0] = 7
(*d)[1] = 10

其中说“在d指向的值处将第7个指定给第0个索引”。我希望这有道理吗?

答案 2 :(得分:1)

d是一个指向10个整数数组的指针。

int (*d)[10]是指向10个整数数组的点的声明。

VS

int *d[10],这是一个包含10个int指针的数组。

对于更复杂的语法(通常涉及指针),我使用cdecl来帮助我解码它。

答案 3 :(得分:0)

它以这种形式使用 int d [10]

我猜你错了,d必须是一种“指针”,而且你在d之前放了*。 但那不是你想要的。你想命名一个整数数组,上面的符号可以看出来。

答案 4 :(得分:0)

指针的概念有时会在C中混淆。

考虑一个数组int d[6] = {0,1,2,3,4,5}

然后,* d相当于d [0]。 d本身是一个指向数组的指针,* d取消引用指针并给出值。

因此,以下代码将打印相同的值:

int main()
{
    int (d)[10];
    *d = 7;
    *(d + 1)=10;
    printf("%d\n",*d);
    printf("%d\n",d[0]);
    return 0;
}

结果:

7
7

请参阅http://codepad.org/LYY9ig1i

如果您按如下方式更改代码:

#include<malloc.h>
int main()
{
    int *d[10]; //not (*d)[10]
    d[0] = (int *)malloc(sizeof(int *) * 10);
    d[0][0] = 7;
    printf("%d\n",d[0][0]);
    return 0;
}

希望这能帮到你!