Можно ли инициализировать массив после объявления в C? - PullRequest
27 голосов
/ 17 января 2012

Есть ли способ объявить переменную, подобную этой, перед фактической ее инициализацией?

    CGFloat components[8] = {
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.15
    };

Я бы хотел, чтобы она объявила что-то вроде этого (за исключением того, что это не работает):

    CGFloat components[8];
    components[8] = {
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.15
    };

Ответы [ 3 ]

30 голосов
/ 17 января 2012

Вы не можете назначать массивы, поэтому в основном вы не можете делать то, что предлагаете, но в C99 вы можете сделать это:

CGFloat *components;
components = (CGFloat [8]) {
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};

оператор ( ){ } называется оператором составной литерал ,Это особенность C99.

Обратите внимание, что в этом примере components объявлен как указатель, а не как массив.

8 голосов
/ 17 января 2012

Если вы заключите свой массив в структуру, он станет назначаемым.

typedef struct
{
    CGFloat c[8];
} Components;


// declare and initialise in one go:
Components comps = {
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};


// declare and then assign:
Components comps;
comps = (Components){
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};


// To access elements:
comps.c[3] = 0.04;

Если вы используете этот подход, вы также можете возвращать Components структуры из методов, что означает, что вы можете создавать функции для инициализации и присвоения структуре, например:

Components comps = SomeFunction(inputData);

DoSomethingWithComponents(comps);

comps = GetSomeOtherComps(moreInput);

// etc.
0 голосов
/ 17 января 2012

Эта запись для массивов и структур действительна только при инициализации, поэтому нет.

...