Rozdíl NULL a nullptr – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rozdíl NULL a nullptr – C / C++ – Fórum – Programujte.comRozdíl NULL a nullptr – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
liamlim0
Newbie
29. 10. 2013   #1
-
0
-

pěkný den přeji,

 
jsem v C++ docela nový, učím se ho z různých zdrojů, záleží jaký článek na internetu nebo v knize mě upoutá. Teď jsem ale narazil na jednu věc, kterou moc nechápu. Moje otázka je:

"Proč se přidávalo do C++ slovo nullptr, když existuje už NULL nebo přiřazení adresy 0 k ukazateli?"

Já si myslím, že některé věci z ukazatelů ještě nechápu úplně jak bych měl, jinak by mi to jistě bylo jasné. Za odpověď děkuji. 

Zatím se mi zdá, že když přeložím soubor jako g++ -std=c++11 program.cpp   tak se nullptr chová úplně stejně jako 0. 

Například v tomto programu jsem testoval, jestli nenajdu rozdíly a nenašel jsem:

 

#include <iostream>
int main()
{
	int * uk_int_nullptr = nullptr;
	int * uk_int_0    = 0;
	int * uk_int_NULL    = NULL;
	int * uk;                                                  // neinicializovan na 0
	
	std::cout << uk_int_NULL <<  std::endl;
	std::cout << uk_int_0 <<  std::endl;
	std::cout << uk_int_nullptr << std::endl;
	std::cout << uk <<  std::endl;
	
	delete uk_int_NULL;
	delete uk_int_0;
	delete uk_int_nullptr;
//	delete uk;
	
	return 0;
}
Nahlásit jako SPAM
IP: 93.99.200.–
Řešení
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #2
-
0
-
Vyřešeno Nejlepší odpověď

NULL je makro - pravdepodobne:   #define NULL 0

Cimz pak muzes klidne srovnavat s cislama a tak dale.

nullptr je uz zarucene const pointer. Pokud ho chces prevest na cislo, musis pouzit reinterpret_cast.

Proste je tam vetsi typova kontrola.

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liamlim0
Newbie
29. 10. 2013   #3
-
0
-

#2 KIIV

Díky za odpověď. K reinterpret_cast jsem se bohužel ještě nedostal, jen jsem něco málo četl. Nevím proto jestli jsem odpověď uplně dobře pochopil, ale zkusil jsem zobrazit NULL pomocí std::cout a zobrazilo se mi 0 a při nullptr se mi to nepřeložilo. já myslel že i kdyby to byl konstantní ukazatel tak se zobrazí jeho adresa když napíšu std::cout << konst_uk << std::endl. například taks e zobrazí adresa konst_uk. 

Při tom přiřazení nullptr do uakzatele se do něj také uložila hodnota 0, proto by měla být podle mě adresa toho nullptr 0. Teď to asi moc nechápu, ale díky za tip, už vím, kde asi hledat problémy.

Nahlásit jako SPAM
IP: 93.99.200.–
vitamin+8
Grafoman
29. 10. 2013   #4
-
0
-

#3 liamlim
Tento príklad ti to vysvetlí:

#include <iostream>

void test(int ){
    std::cout << "parameter je int\n";
}
void test(void* ){
    std::cout << "parameter je pointer\n";
}
int main(){
    test(0);
    test(NULL);
    test(nullptr);
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
liamlim0
Newbie
29. 10. 2013   #5
-
0
-

#4 vitamin

díky za odpověď. Teď jen trochu přemýšlím, proč v tomto:

 

#include <iostream>
int main()
{
	int * const ukazatel = nullptr;
	
	std::cout <<  ukazatel << std::endl;
//	std::cout <<  nullptr  << std::endl;
	
	return 0;
}

nejde odkomentovat ten řádek s nullptr. jestli je to konstantní ukazatel, tak pro něj musí podle mě platit to samé co pro konstantní ukazatel v příkladu. 

Aspoň mám nad čím přemýšlet

Nahlásit jako SPAM
IP: 93.99.200.–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #6
-
0
-

no hlasi to "ambiguous overload" tj. neni jasne, ktere pretizeni operatoru << se ma pouzit

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liamlim0
Newbie
29. 10. 2013   #7
-
0
-

#6 KIIV

 

#include <iostream>
int main()
{
	int * const ukazatel = nullptr;
	
	std::cout <<  ukazatel << std::endl;
	std::cout <<  (void *)nullptr  << std::endl;
	
	return 0;
}

 už funguje, stačí přetypovat na jakýkoliv ukazatel. nechápu ale tedy moc, jaký typ má samotný nullptr. Jistě je to konstantní ukazatel. Ale moc si neumím představit jakého je typu. 

Teď jsem přemýšlel, jestli to není tím, že mohu provézt  char * uk_char = nullptr  stejně jako   int * uk_int = nullptr. Že vlastně std::cout neví, jestli má zobrazovat znaky až po nulový, nebo adresu. To mě jen teď napadlo, třeba je to úplný nesmysl. Jak jsem uz psal, C++ je pro mě docela nové

Nahlásit jako SPAM
IP: 93.99.200.–
vitamin+8
Grafoman
29. 10. 2013   #8
-
0
-

#7 liamlim
nullptr ma specialny typ. Ten typ nema meno, ale mozes ho zyskat napr pomocou prikazu 'decltype':

#include <iostream>

typedef decltype(nullptr) nullptr_t;
//alebo pouzi  std::nullptr_t

std::ostream& operator<<(std::ostream& out, nullptr_t n){
    out << "nullptr";
    return out;
}

int main(){
    std::cout << nullptr;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
liamlim0
Newbie
29. 10. 2013   #9
-
0
-

#8 vitamin

je to dost zajímavé, díky. O decltype jsem ještě neslyšel, hádám že je to nějaké nové slovo v C++. Téma už považuji za vyřešené, dál se ptát asi nebudu, jen poslední můj dotaz směřuje k tomu jestli někde jde sehnat nový seznam všech klíčových slov v C++? Hledal jsem, jestli jsou nějaká nová kromě nullptr, ale žádná jsem nenasel, za nějaké info o tom, která konkrétně byla přidána naposledy bych byl rád. díky

Nahlásit jako SPAM
IP: 93.99.200.–
vitamin+8
Grafoman
29. 10. 2013   #10
-
0
-
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

Podobná vlákna

NULL — založil Sss

Realloc a NULL — založil olgo

(Array == NULL) = 1 -> ? — založil Matěj Andrle

Null hodnoty DataReader — založil Johnnny

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý