wskaźnik do stałego łańcucha znaków

0

(z kanonu c++)

Czy mogę wskazywać wskaźnikiem do char

char *ptr

do stałego łańcucha znaków?

const char str[] = "foobar"

0

W deklaracji wskaźnika musisz napisać, że wskazuje on na obiekt stały.
Tutaj słowo kluczowe const może stać w dwóch miejscach:

const char *ptr;
  • wskaźnik do stałej (wskaźnik wskazuje na element const)
char *const ptr;
  • stały wskaźnik (wskazuje zawsze w to samo miejsce)
0

niektóre kompilatory wyrzucą ci bład albo przynajmniej ostrzeżenie. Wskażnik powinien być tego samego typu co zmienna na którą wskazuje więc lepiej nie rób takich sztuczek. Poza tym jeżeli deklarujesz stały łańcuch to znaczy, że nie chcesz żeby był przypadkowo zmieniony a wykorzystując zwyczajny wskaźnik możesz go zmienić poprzez ten wskaźnik.

0

Chodzi o to, że chciałem zrobić funkcję zajmującą się zwracaniem błędu, a dokładniej żeby funkcja zwracała (w przypadku powstania błędu gdzieś w programie) wskaźnik do tekstu błędu; sam tekst konkretnego błędu powinien być niezmienny (wiadomo).

const char err_0[] = "nie ma błędu";
const char err_1[] = "za mało pamięci";
const char err_2[] = "za mało miejsca w szafie";

char* current_error;

char* GetLastError(){
  char *ptr = current_error;
  current_error = err_0; // ***
  return ptr;
}

Przy przypisywaniu *** wyjdzie błąd, a nie chce rezygnować ze "stałości" komunikatów błędów.

0

Więc zrób jak napisałem:

const char *ptr;

W ten sposób nie będzie błędu i jednocześnie kompilator nie pozwoli na zmianę stringu przez wskaźnik.

0
const char* tablica

oznacza tablice znakow char, ktore akurat sa stalymi
a jesli chcesz uczynic WSKAZNIK niezmienny to

char* const tablica

. jednakze zapis ten sprawi, ze nie mozesz zmienic zawartosci tablicy a sprwic by wskaznik wskazywal co innego. wiec najwlasciwszym rozwiazaniem wydaje sie const char* const tablica

0

Rafal_F twój zapis nic nie da funkcja i tak zwraca zwykły wskaźnik, którym można modyfikować elementy.

Teraz powinno być dobrze:

const char err_0[] = "nie ma błędu";
const char err_1[] = "za mało pamięci";
const char err_2[] = "za mało miejsca w szafie";

const char* current_error;

const char* GetLastError(){
  const char *ptr = current_error;
  current_error = err_0;
  return ptr;
}
0
const char* current_error;

no tak, ale właśnie chodzi o to, że każda inna funkcja w module powinna móc zmeniać current_error i przez to pokazywać, e nastąpił jakiś błąd, którego treść możnaby uzyskac przez GetLastError

0

a teraz z innej beczki, przeciez to ty piszesz ten program, czy ktos cie zmusza do modyfikacji tych danych ?

/*const*/ struct {
  int numer;
  char* nazwa;
}* errory[]={{0,"ok"},{1,"ala ma okres"},{2,"wsciekl sie pies"},{3,"ale ta pani ma wąsa"},{4,"juz nie bede przejezdzal na czerwoym panie wladzo"}};

// chyba dobrze zadeklarowalem, nie wiem ;p

0
Bucz napisał(a)
const char* current_error;

no tak, ale właśnie chodzi o to, że każda inna funkcja w module powinna móc zmeniać current_error i przez to pokazywać, e nastąpił jakiś błąd, którego treść możnaby uzyskac przez GetLastError

No przecież możesz zmieniać, const char* -> wskaźnik do stałej, nie stały wskaźnik.
Chyba jedyne sensowne rozwiązanie:

// ew. const char* const :)
const char err_0[] = "nie ma bledu";
const char err_1[] = "za malo pamieci";
const char err_2[] = "za malo miejsca w szafie";

const char* current_error;

const char* GetLastError(){ // TU: const char* zwracaj! albo const char* const jak tak bardzo chcesz być pedantyczny, tylko po co...?
    //..jak tam chcesz...
    return current_error;
}

void foo()
{
    current_error = err_1;
}

void bar()
{
    current_error = "blad";
}

int main()
{
    foo();
    bar();
}

Zresztą Heimdall już ci to napisał... Zrób z tym co chcesz i po swojemu.

0
Bucz napisał(a)
const char* current_error;

no tak, ale właśnie chodzi o to, że każda inna funkcja w module powinna móc zmeniać current_error i przez to pokazywać, e nastąpił jakiś błąd, którego treść możnaby uzyskac przez GetLastError

wskaźnik current_error możesz dowolnie zmieniać; nie możesz tylko modyfikować łańcuchów na które wskazuje

current_error = err_0; //dobrze
current_error = "fcgdfgd"; //dobrze
curren_error[2] = 'f'; //błąd
0

w sumie...

... to moge

0

a co z const_cast<char*> ???

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