Miejsce "*" - wskaźniki

0

Witam,

zastanawia mnie sens stawiania *

int *wsk1;
// lub
int* wsk1; 

Na internecie doczytalem, ze

 int *wskaznik, zmienna;
Czyli przez dodanie gwiazdki przed nazwą wskaźnika. Można również zadeklarować w ten sposób:
int* wskaznik1, wskaznik2;
Co też jest poprawne, aczkolwiek wszystkie definiowanie w ten sposób zmienne są wskaźnikami, i może to prowadzić do błędów w programie, gdyż wydaje się nam że tylko pierwsza zmienna jest wskaźnikiem.

ale nie ma to potwierdzenia w internecie. Czy jakas mniej zanana konwencja sposoby pisania. Coś w stylu Klasy z dużej litery itp ;>

0

Kwestia indywidualna, ja osobiście preferuje gwiazdkę przy typie, bo uważam ze to jest część typu (typ np. "wskaźnik do int") a nie część zmiennej/obiektu.

0

Nie wierz we wszystko, co przeczytasz w Internecie.

int*    a, b;

i

int   *a, b;

są równoważne i oba tworzą jeden wskaźnik i jednego INTa.
Sprawdź sam:

#include <stdint.h>
#include <stdio.h>


int main(void) {
        uint8_t*        wsk1, wsk2;

        fprintf(stdout, "%d, %d\n", sizeof(wsk1), sizeof(wsk2));

        return 0;
};

Na 32bit to Ci zwróci:

4, 1

A według tego, co doczytałeś gdzieś tam powinno zwrócić dwie 4.
Jeśli chcesz zadeklarować dwa wskaźniki w jednej linii, musisz to zrobić tak:

int   *a, *b;

lub tak (jeśli lubisz):

int*   a, *b;

Położenie znaku '*' nie ma znaczenia.

0

A żeby Ci bardziej pokazać, że położenie gwiazdki nie ma znaczenia:

int*wsk;

też jest poprawne... Niezbyt czytelne, ale poprawne.

0

Dziękuje bardzo za bardzo merytoryczne wypowiedzi. Ciągnąc dalej wątek wskaźników zastanawia mnie sens używania wskaźnikow na funkcja. Czy można traktować ten zabieg podobnie jak wskazniki na zwykłych zmiennych ? Innymi słowy co takiego nie zwykłego daje nam używanie wskaznikow na funkcjach. Moze jakies dodatkowe profity ponadto, ze "wskazujemy na funkcje"?

Przykład na którym opieram swoje rozważania

// pointer to functions
#include <iostream>
using namespace std;

int addition (int a, int b)
{ return (a+b); }

int subtraction (int a, int b)
{ return (a-b); }

int operation (int x, int y, int (*functocall)(int,int))
{
  int g;
  g = (*functocall)(x,y);
  return (g);
}

int main ()
{
  int m,n;
  int (*minus)(int,int) = subtraction;

  m = operation (7, 5, addition);
  n = operation (20, m, minus);
  cout <<n;
  return 0;
} 
0

Wskaźnik jest to zmienna przechowująca adres "komórki" pamięci. To wszystko. Wskaźnik na funkcję zatem nie różni się zbytnio od wskaźnika na cokolwiek innego. Od programisty zależy jak to wykorzysta.
Wskaźnik na funkcję daje Ci możliwość przekazania... funkcji. Np. jako argumentu dla innej funkcji, czy jako elementu tablicy. Wykorzystuje się to najczęściej w tzw. callbackach, którym przekazujesz adres do funkcji jaką mają wykonać w określonym przypadku. Bez wskaźników realizacja tego byłaby niemożliwa, lub bardzo utrudniona.

0

Dziękuje pięknie :)

0

@autor: w przypadku jaki pokazałeś zastosowanie jest marne. Ale wyobraź sobie że piszesz funkcję sortującą która ma sortować dowolne obiekty (!) na podstawie funkcji porównującej którą do niej przekazujesz ;)

0

Zapomniałem jeszcze o bardzo przydatnym użyciu wskaźników na funkcję (odnosząc się do przykładowego kodu, który podałeś). Nie wiem jak to się fachowo nazywa, ja nazywam to aliasowaniem. Wyobraź sobie, że masz do przetworzenia ileś plików. Pomimo, że zawierają one ten sam typ danych, ich formaty są różne (np. część jest w XML, część w JSON, reszta to binarki). Dzięki wskaźnikom na funkcję możesz stworzyć różne funkcje parsujące (np. parse_xml(), parse_json(), parse_bin()) i w zależności od aktualnie przetwarzanego pliku przypisać do właściwej z nich wskaźnik o jednej nazwie i główny blok przetwarzania utrzymać niezmiennym, gdyż wywoływana w nim będzie funkcja o nazwie np. parse(), która "jest wskaźnikiem" na właściwy parser. Dzięki temu możesz także w łatwy sposób dodawać wsparcie dla innych formatów, bez modyfikacji głównej logiki programu.

0

int wskaznik, zmienna;
Czyli przez dodanie gwiazdki przed nazwą wskaźnika. Można również zadeklarować w ten sposób:
int
wskaznik1, wskaznik2;
Co też jest poprawne, aczkolwiek wszystkie definiowanie w ten sposób zmienne są wskaźnikami, i może to prowadzić do błędów w programie, gdyż wydaje się nam że tylko pierwsza zmienna jest wskaźnikiem.

W tym opisie jest jakiś bałagan myślowy. Żeby było jasno:
jak już Kumashiro powiedział, oba zapisy

int* wskaznik1, wskaznik2;
int *wskaznik1, wskaznik2;

znaczą to samo, tylko pierwsza zmienna jest wskaźnikiem. Bez względu na to, co się wydaje.
Dlatego w C/C++ lepiej stosować zapis drugi: by podkreślać że * wiąże się bardziej z nazwą zmiennej, a nie typem.
Bez względu na to, czy ktoś uważa taki zapis za brzydszy (np. ja) czy ładniejszy.
C++ to nie jest ładny język.

1 użytkowników online, w tym zalogowanych: 0, gości: 1