2017-10-31 156 views
7

Z tego co zrozumiałem, przekazuję adres zmiennej a do funkcji int ffx1.Co to jest "p = (int [2]) {* p};" linia w punkcie C?

Po tym, co dokładnie oznacza ta linia p = (int[2]){*p};?

int ffx1(int * p) 
{ 
    p = (int[2]){*p}; 
    return(p[1]); 
} 

int main() 
{ 
    int a = 1; 
    a = ffx1(&a); 
    printf("%d", a); 

    return 0; 
} 
+5

'(int [2]) {* p}' jest dosłownym związkiem. 'p = (int [2]) {* p};' taki jak 'int array [2] = {* p, 0}; p = array; ' – BLUEPIXY

+0

jeśli jest to dosłowny składający się na macierz, to nie określa wartości dla drugiego elementu tablicy, który jest zwracany, który mógłby być UB –

+0

@AndyG Tak, jest, zobacz komentarz BLUEPIXY . –

Odpowiedz

7

Jest to wskaźnik do literałów złożonych.

C11-§6.5.2.5 Związek literałami (P9)

Przykład 2 W przeciwieństwie do tego, w

void f(void) 
{ 
int *p; 
/*...*/ 
p = (int [2]){*p}; 
/*...*/ 
} 

P jest przypisany adres pierwszego elementu tablicy dwa ints, pierwszy mający wartość poprzednio wskazywaną przez p i sekundę, zero. Wyrażenia w tym języku nie muszą być stałe. Obiekt bez nazwy ma automatyczny czas przechowywania.

11

Z int ffx1(int * p), p jest wskaźnikiem do int.

(int[2]){*p} jest związek dosłownym definiowania int tablicy 2 @BLUEPIXY to Nienazwana tablicy nazwiemy X[2]. Pierwszy element ma wartość *p, a następny element, będący int, zostanie zainicjowany do zera (§ 6,7.9 21 & 10), ponieważ nie jest jawnie wymieniony.

p = .... przypisano wskaźnik p do nowej wartości. W takim przypadku powyższa tablica X[] jest konwertowana na adres jej pierwszej rejestracji lub &X[0].

return p[1] de-references p, zwracając wartość w X[1] lub 0.

+0

Dzięki. twoja odpowiedź jest właściwa .. Ale skoro jest mowa o p [1] i int [2], to jaka jest długość tablicy bez nazwy? 2 lub 3? – hago

+0

@hago .: 2 ...... – coderredoc

+0

@hago Nienazwana tablica, zwana 'X []' w tej odpowiedzi, składa się z 2 elementów z powodu '(int [2])'. – chux