2011-09-11 255 views
1

下面的程序在初始化过程中给我一个错误(*a)[5]=((*)[])&v;。 当我不打那条线时,我仍然收到错误。指向c中的数组的指针

int main() 
{ 
    int v[10]; 
    int **p; 
    int (*a)[5]; 
    (*a)[5]=((*)[])&v; 
    printf("%d\n",*a); 
    printf("%d\n",sizeof(v)); 
    return 0; 
} 
+5

你以为你在做什么?应该是什么? –

+0

什么是错误? – tenpn

+6

哦,痛..... –

回答

4

当您指的是错误时,您可能会引用运行时错误。 int(* a)[5]是一个指向5个整数的指针,它永远不会被初始化。但是在下一行中,您尝试对其进行解引用。你应该在使用它之前初始化'a',你可能试图用v初始化它,但这不是一个5整数的数组。如果你要将v重新声明为int v [5],那么a = & v应该可以工作。

+0

虽然可能不是最好的风格,但如果他使用'(int(*)[5])&v',它应该工作,不管v的大小'。 –

5

&v是对int数组v的引用,所以它的类型为int **(基本上)。 int (*a)[5]表示您正在声明一个指向5个整数的数组的指针。但是,在下一行中,当您编写时,(*a)[5],这意味着您正在取消引用a以获取int指针,然后再次取消重新访问存储在[5]处的元素。但C中的数组是零索引的,因此您只能访问[0][4],并且未分配[5]

你想要a = &v。这将使a成为int指针v的指针。还有其他的问题,如*a是一个int指针,以便"%d"不会飞,你没有给任何值av((*)[])仅仅是不必要的,等

+0

对于谁来说,你能评论一下为什么?我认为我没有写错任何东西。 – BlackJack

+1

:谢谢你解释清楚。但&v将给int指针指针,而不是指向int的指针。如果尝试过p =&v;编译器会抛出一个错误,指出无法从'int(*)[10]'转换为'int **'。 – Angus

+0

我没有-1,但你的答案似乎在几点说,数组是指针,这是相当错误的。 '&v'的类型是int(*)[10]',而不是'int **',我很惊讶从int(*)[10]'类型的变量和另一个'int (*)[5]'没有演员阵容。 –

4

赋值给变量a应该只有a上LHS。

2

我认为这是简单的比你期望

#include <stdio.h> 

int main() 
{ 
    int v[10]; 
    int **p; 
    int *a[5]; 

    v[0] = 1234; 
    a[0] = v; 

    printf("%d\n", *a[0]); 
    printf("%d\n", sizeof(v)); 

    return 0; 
} 

* A [5]为int *指针数组。 v [10]也是一个指向int的指针。

所以* a和a [0]实际上是相同的东西。 ETA:也许printf(“%d \ n”,a [0] [0]);是更好的

+0

'a [0]'是解引用垃圾指针。 –

+0

我不这么认为。 – bobc