2015-10-06 93 views
0

我保持我的朋友写的代码的一部分,这里有被称为d一个变量的定义:双指针或数组指针的指针?

double (*d)[3]; 

我尝试使用下面的代码来初始化变量,但每部分有错误(运行时或编译)。我弄糊涂了变量d是一个指向双精度数组的指针还是加倍的指针数组。

double k; 
(*d)[0] = k; // runtime error using gcc compiler 
d[0] = &k; // Compilation error, assignment to expression with array type 
*d = &k;  // Compilation error, assignment to expression with array type 
+0

这对标记编程语言会有帮助。是的,有些人会从代码中识别语言。但不是每个人都会这样做。 – Peter

+1

记住螺旋规则:http://c-faq.com/decl/spiral.anderson.html – ChronoTrigger

回答

4

d变量是一个指针,指向3长度double阵列。所以你可以给它分配一个double[3]数组的指针。例如:

double (*d)[3]; 
double a[3] = {1.0, 2.0, 3.0} 
d = &a; 

但是为了使它更实用,您还可以使用动态内存分配。例如:

double (*d)[3]; 
d = malloc(3 * sizeof(double)); 
d[0][0] = 1.0; 
d[0][1] = 2.0; 
d[0][2] = 3.0; 
printf("%f %f %f\n", d[0][0], d[0][1], d[0][2]); 

这样,d将指向一个单一的,3-长度double阵列。该程序将提供以下输出:

1.0 2.0 3.0 

顺便说一句,您可以替换例如d[0][0](*d)[0],它们的含义完全相同。

+0

很好的答案。我想添加的东西是铸造'malloc'输出(指向double的指针)不会在我的'DEV'编译器中隐式执行。我不得不使用'd =(double(*)[3])malloc(3 * sizeof(double));'。 – Mehrshad

+1

然后改变你的编译器。在C中,你不会投射malloc,它不是C++! – meskobalazs