Pytanie jest w tytule, jak zainicjować char * [] i podać wartości w C++, dziękuję.Inicjowanie Char * []
Odpowiedz
Chociaż jesteś prawdopodobnie świadomy, char * [] jest tablicą wskaźników do postaci i domyślam się, że chcesz przechowywać pewną liczbę ciągów znaków. Inicjowanie tablicę takich wskaźników jest tak proste, jak:
char ** array = new char *[SIZE];
... lub jeśli przydzielania pamięci na stosie:
char * array[SIZE];
Będziesz wtedy prawdopodobnie chcesz, aby wypełnić tablicę z pętla takich jak:
for(unsigned int i = 0; i < SIZE; i++){
// str is likely to be an array of characters
array[i] = str;
}
jak zauważył w komentarzach do tej odpowiedzi, jeśli alokowania tablicę z nowym (dynamiczny przydział) pamiętaj, aby usunąć tablicę z:
delete[] array;
' char ** array = new char [ROZMIAR]; 'powinno być' char ** array = new char * [ ROZMIAR]; ' – xian
Tak więc powinno, dzięki za wskazanie :) –
Możesz również przypomnieć, że jeśli tablica jest przydzielana dynamicznie, powinna zostać usunięta przy użyciu' delete [] array' (użycie 'delete array' jest błędem obecnego początkującego) . – kriss
Podobnie jak każdy inny tablicy:
char *a, *b, *c;
char* cs[] = {a, b, c}; // initialized
cs[0] = b; // assignment
W zależności od tego, co chcesz, aby zainicjować można zrobić żadnej z:
char mystr[] = {'h','i',0};
char * myotherstring = "my other string";
char * mythirdstring = "goodbye";
char * myarr[] = {0};
char * myarr[] = {&mystr, myotherstring};
char * myarr[10];
char * myarr[10] = {0};
char * myarr[10] = {&mystr, myotherstring, mythirdstring, 0};
itp itd
Czy '& mystr' i' & myotherstring' nie rozwiąże problemu typu char [] * ', który nie jest oczekiwanym' char * 'inicjatorem tablicy? – Romain
Ja zredagowałem swoją odpowiedź nieco, a jak to jest teraz powinno działać. –
Występuje również problem różnicy między char * i const char * Używam mojego kompilatora do zgłaszania ostrzeżenia za każdym razem, gdy próbuję przypisać const char * (ciągi stałe) do znaku *. – kriss
Jak to:
char* my_c_string;
char* x[] = { "hello", "world", 0, my_c_string };
To jest bardzo dobry przykład. 0 pomogłoby również w zakończeniu pętli, jeśli jakaś funkcja po prostu bierze argument jako void foo (char * x []) nie musisz mieć innej zmiennej, aby znaleźć długość tablicy. – siddhusingh
#include <iostream>
int main(int argc, char *argv[])
{
char **strings = new char *[2]; // create an array of two character pointers
strings[0] = "hello"; // set the first pointer in the array to "hello"
strings[1] = "world"; // set the second pointer in the array to "world"
// loop through the array and print whatever it points to out with a space
// after it
for (int i = 0; i < 2; ++i) {
std::cout << strings[i] << " ";
}
std::cout << std::endl;
return 0;
}
tak:
char p1 = 'A';
char p2 = 'B';
char * t[] = {&p1, &p2};
std::cout << "p1=" << *t[0] << ", p2=" << *t[1] << std::endl;
Ale jakoś nie wierzę, że to odpowiedź na realną pytanie ...
cię chcesz mieć tablicę łańcuchów C zdefiniowanych podczas kompilacji, powinieneś użyć tablicy const char * zamiast:
const char * t2[] = {"string1", "string2"};
std::cout << "p1=" << t2[0] << ", p2=" << t2[1] << std::endl;
Bez const mój kompilator powiedziałby: ostrzeżenie: przestarzałe konwersji z ciągiem stałym do „char *”
Jeśli naprawdę chcą tylko tablicę C stylu stałych ciągów (np indeksowane wiadomości):
const char* messages[] =
{
"Beginning",
"Working",
"Finishing",
"Done"
};
Jeżeli jednak starasz się utrzymywać pojemnik uruchomieniowych ciągów zmiennych, używając C++ siłownia std::vector<std::string>
uczyni śledzeniem wszystkich operacji pamięciowych znacznie łatwiejsze.
std::vector<std::string> strings;
std::string my_string("Hello, world.")
strings.push_back("String1");
strings.push_back(my_string);
Jedna rzecz, którą zauważyłem, że musisz uważać na ... C i C++ nieco się rozdzieliły w składni inicjalizacji. Jak zaznacza Mark B. powyżej, można zainicjować tablicę znaków w następujący sposób:
const char* messages[] =
{
"Beginning",
"Working",
"Finishing",
"Done"
};
Ale w C++. jak zauważy kriss, to wyświetla ostrzeżenie o przestarzałej konwersji z ciągu znaków na znak *. To dlatego, że C++ zakłada, że będziesz chciał używać ciągów dla ciągów; -}.
To nie zawsze prawda. Więc jeśli naprawdę chcesz zainicjować tablicę char *, znalazłem, że muszę to zrobić tak:
const char* messages[] =
{
(char*)("Beginning"),
(char*)("Working"),
(char*)("Finishing"),
(char*)("Done")
};
kompilator jest teraz szczęśliwy ...
- 1. Inicjowanie z charakterem vs tablicy char
- 2. Inicjowanie tablicy char z mniejszymi String Dosłowne
- 3. Inicjowanie rzutowania aż do wskaźnika
- 4. Char Array VS Char *
- 5. Inicjowanie tablicę obiektów
- 6. Inicjowanie data.frames()
- 7. Inicjowanie NSDictionary
- 8. Alokacja pamięci char * i char []
- 9. Dodatek C char do char *
- 10. C++ char ** do char ** konwersji
- 11. C Konwertuj char na char *
- 12. char array vs. wskaźnik char
- 13. Inicjowanie struktury z typami struct wewnątrz
- 14. Inicjowanie Order statycznych pól statycznych klasy
- 15. C - Inicjowanie tablicy globalnej w funkcji
- 16. Inicjowanie połączenia wideo
- 17. Inicjowanie tablic w Scali
- 18. Scala - Inicjowanie środowiska REPL
- 19. Inicjowanie skalary z szelkami
- 20. leniwe inicjowanie za darmo
- 21. inicjowanie ruby singleton
- 22. Inicjowanie opóźnionej cechy
- 23. Inicjowanie listę z tablicami
- 24. Angular.js inicjowanie sterownika opóźniającego
- 25. Inicjowanie referencji elementów poprawnie
- 26. Inicjowanie właściwości readonly
- 27. Bezwzględnie inicjowanie Jquery Mobile?
- 28. Inicjowanie reagować stan
- 29. Inicjowanie nieostatniego pola
- 30. Inicjowanie odwołań w C++
Dlaczego nie chcesz używać stl? jak w std :: vector? –
'... = {" cześć "," świat "}" nie działa? –
ponieważ std :: vector jest odpadem, gdzie char * [] zrobi? –