2015-10-06 4 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 будет указывать на один, три длины 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