2010-09-22 20 views
26

Konwertuję plik nagłówka dla biblioteki DLL napisanej w C na Delphi, więc mogę użyć biblioteki DLL.Różnica między int * i int * i

Moje pytanie brzmi: jaka jest różnica między

int* i 

i

int *i 

przekonwertować pierwszy

i: PInteger; 

ale nie jestem pewien, co jest poprawna konwersja dla drugiego w Delphi.

Z mojego rozumienia pierwszy jest prosty wpisany wskaźnik. Druga to zmienna wskaźnika. ale nie jestem pewien, na czym polega różnica.

+0

możliwy duplikat [W C, dlaczego gwiazdka jest przed nazwą zmiennej, a nie po znaku?] (Http://stackoverflow.com/questions/398395/), [Jaki jest twój preferowany styl deklaracji wskaźnika i dlaczego?] (http://stackoverflow.com/questions/377164/) – outis

Odpowiedz

27

int* i i int *i są całkowicie równoważne

+0

Zatem różnica w nagłówku DLL to brak spójności lub literówki. dzięki – MikeT

+0

Jeśli masz zamiar podziękować temu facetowi, czy mógłbyś również przyjąć jego odpowiedź? –

+20

Przykro mi, ale nie mogłem zaakceptować odpowiedzi od razu, ponieważ odpowiedź na to pytanie była tak szybka. Mam wiadomość, że mogę tylko zaakceptować odpowiedź za 11 minut. – MikeT

4

Nie ma różnicy. Możesz go wpisać jako int * i, jeśli chcesz; wszystkie mają na myśli to samo: "ja jestem wskaźnikiem do int".

44

Jeśli chodzi o C, obie robią to samo. Jest to kwestia preferencji. int* i pokazuje wyraźnie, że jest to typ wskaźnika int. int *i pokazuje, że gwiazdka wpływa tylko na jedną zmienną. Tak więc int *i, j i zarówno utworzą i jako int wskaźnik i j jako int.

+21

+1 za wyjaśnienie "int * i, j' caveat – pmg

+0

wydaje mi się, że już to wiedziałem, ale od ponad 10 lat, odkąd zrobiłem kodowanie C/C++. – MikeT

+0

Czy lubisz te dziwactwa językowe :-) Tak się cieszę, że zupełnie o tym zapomniałem, ale dobrze jest widzieć to gdzieś z wysoką oceną. –

2

To to samo.

Niektórzy programiści preferują notację int* i, ponieważ w ten sposób typ i jest wyraźnie "wskaźnikiem do int", natomiast int *i wydaje się mniej czytelny.

+0

Jestem ciekawy, dlaczego uważasz, że ten ostatni jest mniej czytelny? Dzięki. – johnny

2

int* i, int * i, int*i i int *i są dokładnie równoważne. Wynika to z kompilatora języka C (i zgodnych z nim systemów C), ignorując spacje w strumieniu tokenów generowane podczas procesu analizowania kodu źródłowego.

Niektórzy ludzie wolą używać int* i myśląc, że czyni to kod czystszy (ponieważ dyrektywa wskaźnikowa jest postrzegana jako część typu w ich głowach). Niektórzy ludzie wolą używać int *i myśląc, że to sprawia, że ​​kod jest czystszy (jako typ jest int i mają do niego wskaźnik "i"). Żadna z technik faktycznie nie robi nic inaczej po tym, jak kompilator uruchomi kod źródłowy. W razie wątpliwości naśladuj istniejący styl.

9

Są takie same. Dwa różne style pochodzą z dziwactwa w składni C.

Niektórzy ludzie wolą int* i;, ponieważ int* jest typem i.

Inni wolą int *i;, ponieważ analizator składni przypisuje gwiazdkę do zmiennej, a nie typ. Ma to sens tylko wtedy, gdy spróbujesz zdefiniować dwie zmienne na linii. Niezależnie od tego, jak napisać go:

int* i,j; 
int*i,j; 
int *i,j; 

w każdym z nich, i jest wskaźnik do int, natomiast j jest tylko int.Ostatnim składnia sprawia, że ​​jaśniejsze, choć jeszcze lepiej byłoby:

int j, *i; 

lub najlepiej jeszcze:

int *i; 
int j; 
9

To wypadek składni C, które można napisać albo int *i lub int* i lub nawet int * i. Wszystkie są przetwarzane jako int (*i); IOW, * jest związany z deklaratorem, a nie ze specyfikatorem typu. Oznacza to, że w deklaracjach jak

int* i, j; 

tylko i jest zadeklarowana jako wskaźnik; j jest deklarowana jako zwykła int. Jeśli chcesz zadeklarować oboje jako wskaźniki, trzeba by napisać

int *i, *j; 

Większość C programistów używa T *p w przeciwieństwie do T* p, ponieważ a) deklaracje w C są wyrazem-centric, nie obiekt-centric oraz b) bardziej odzwierciedla składnię deklaracji.

Jako przykład tego, co rozumiem przez wyrażenie-centryczne, załóżmy, że masz tablicę wskaźników do int i chcesz uzyskać wartość całkowitą w elemencie i. Wyrażenie odpowiadające tej wartości to *a[i], a wyrażenie tego wyrażenia to int; w związku z tym deklaracja tablicy to:

Kiedy widzisz wyrażenie "deklaracja używa mimika" w odniesieniu do programowania w języku C, to właśnie ma na myśli.

Powiązane problemy