2016-08-12 34 views
5

W unqlite c bibliotece znalazłem następujący kod:Adres dereferencjonowane wskaźnik skonstruować

pObj = jx9VmReserveMemObj(&(*pVm),&nIdx); 

gdzie pVm jest:

typedef struct jx9_vm jx9_vm; 
jx9_vm *pVm 

i funkcja nazywana jest zadeklarowana jako:

jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *); 

Co dla konstrukcji &(*pVm) jest użyte w wywołaniu zamiast tylko pVm? Czy &(*pVm) jest odpowiednikiem pVm?

+2

widzę żadnego powodu, aby używać '& (* PVM)' na 'PVM '. – haccks

+0

@haccks Wspomniałem (ogólny) w mojej odpowiedzi. :) –

Odpowiedz

7

Cytowanie C11 rozdział §6.5.3.2, adresowa i zadnie operatorzy

[...] Jeśli argument jest wynikiem jednoargumentowego * operatora że ani operator, ani operator & jest oceniany, a wynik jest taki, jakby oba zostały pominięte, z tym że ograniczenia dla operatorów nadal obowiązują , a wynik nie jest lwartością. [...]

Więc takrównoważne.

Ta konstrukcja może być jednak używana do sprawdzenia typu argumentu względem typu wskaźnika. Z majątku jednoargumentowego * operatora

Argument z jednoargumentowego * operator ma typ wskaźnika.

więc, konstrukt &(*pVm)

  • będzie dobrze, jeśli pvm to nazwa wskaźnik lub tablicą.
  • wygeneruje błąd kompilatora, jeśli pvm nie jest zmienną typu wskaźnik.

Zobacz przykład the other answer by Alter Mann dla przykładu kodu.

Jeszcze jedna różnica (ogólnie) jest pVm można przypisany (może być stosowany jako LHS operatora przypisania), ale &(*pVm) nie.

+2

"* Tak więc, różnica ... *" co nie ma znaczenia w kontekście przykładu OP. – alk

+0

@Sravav dziękuję! – shibormot

+1

@alk Bardzo dobrze, ale może być inne użycie i to szczególne użycie może być utrzymaniem jednolitego standardu kodowania dla tego projektu. Dodano jednak wymagane zastrzeżenie. ;) –

4

Czy &(*pVm) jest odpowiednikiem pVm?

Tak. * 1

To samo dla *(&pVm).


(* 1) Jako * -operator (de przedstawieniu) tylko zastosowanie wskaźników, były konstrukcja działa jedynie na wskaźnik (albo matrycy, co rozpadu do wskaźnika na jego pierwszy element). Te ostatnie można zastosować do dowolnego typu zmiennej.:

2

Tak, są takie same, ale zauważ, że to się nie powiedzie, gdy obiekt nie jest tablicą lub wskaźnik:

#include <stdio.h> 

struct t { 
    int value; 
}; 

typedef struct t t; 

int func(t *ptr) 
{ 
    return ptr->value; 
} 

int main(void) 
{ 
    t o = {.value = 0}; 
    t v[2] = {{.value = 1}, {.value = 2}}; 

    printf("%d\n", func(&(*o))); /* error: invalid type argument of unary ‘*’ */ 
    printf("%d\n", func(&(*v))); /* WORKS */ 
    return 0; 
} 
+0

Proszę pana, mam nadzieję, że nie będziesz miał nic przeciwko umieszczeniu linka do twojej odpowiedzi w mojej. :) –

+0

Bez problemu Sourav;) –