• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ wskaźnik

Object Storage Arubacloud
0 głosów
342 wizyt
pytanie zadane 9 listopada 2020 w C i C++ przez Jedwab Użytkownik (550 p.)

Dlaczego na odcinku u MZ ten kod dziala, a u mnie w linijce z "cout<<(int)tablica<<endl;".

Wyskakuje błąd - error from 'int*' to 'int' loses precision [-fpermissive]

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;
#include <iostream>

using namespace std;

int ile;

int main()
{
    cout << "Ile liczb w tablicy: ";
    cin>>ile;

    //dynamiczna alokacja tablicy
    int *tablica;
    tablica=new int [ile];

    //pokaz kolejne adresy komorek w tablicy
    for (int i=0; i<ile; i++)
    {
        cout<<(int)tablica<<endl;
        tablica++;
    }

    delete [] tablica;
    tablica=NULL;


    return 0;
}

 

2 odpowiedzi

+3 głosów
odpowiedź 9 listopada 2020 przez tangarr Mędrzec (154,860 p.)
Kod prezentowany był na starym 32 bitowym systemie operacyjnym, gdzie wskaźnik jest tej samej długości co zmienna int (4 bajty).

Na platformach 64 bitowych wskaźniki mają długość 8 bajtów.

Aby skompilować kod wystarczy zmienić rzutowanie w 24 linijce z int na long long.
komentarz 11 listopada 2020 przez tangarr Mędrzec (154,860 p.)

Według standardu long ma długość przynajmniej 32 bit.

Cytat z cppreference

Data models

The choices made by each implementation about the sizes of the fundamental types are collectively known as data model. Four data models found wide acceptance:

32 bit systems:

  • LP32 or 2/4/4 (int is 16-bit, long and pointer are 32-bit)
  • Win16 API
  • ILP32 or 4/4/4 (int, long, and pointer are 32-bit);
  • Win32 API
  • Unix and Unix-like systems (Linux, macOS)

64 bit systems:

  • LLP64 or 4/4/8 (int and long are 32-bit, pointer is 64-bit)
  • Win64 API
  • LP64 or 4/8/8 (int is 32-bit, long and pointer are 64-bit)
  • Unix and Unix-like systems (Linux, macOS)

Na Windowsie 64bit long nie może pomieścić wskaźnika

komentarz 11 listopada 2020 przez j23 Mędrzec (194,920 p.)

Dlatego powstał typ intptr_t, który rozwiewa te dylematy.

komentarz 11 listopada 2020 przez tangarr Mędrzec (154,860 p.)
Ostatnio oglądałem prezentację (chyba z CppCon2016) i były omawiane typy z biblioteki cstdint.
Ciekawostką było, że typ intptr_t jest typem opcjonalnym. To znaczy, że mogą istnieć platformy na których wskaźniki są dłuższe niż jakakolwiek zmienna całkowitoliczbowa. Prowadzący nie potrafił wskazać takiej platformy sprzętowej, ale założył, że grupa standaryzacyjna języka nie bez powodu tak ustaliła.
komentarz 11 listopada 2020 przez j23 Mędrzec (194,920 p.)
Ze standardami już tak jest, że muszą uwzględniać istnienie niszowych platform.
komentarz 11 listopada 2020 przez mokrowski Mędrzec (155,460 p.)
Co do takich platform, to np. procesory DSP. Typ char może mieć 16 bitów lub nawet więcej (i z takim skokiem można adresować dane) a wskaźniki w zależności od rodziny sprzętu. Bywają także 24 bitowe. W x86 w trybie segmentowym, także wskaźnik może być far i near: https://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes
0 głosów
odpowiedź 11 listopada 2020 przez Eriss69 Gaduła (4,470 p.)
#include <iostream>
#include <time.h>
#include <cstdlib>
 
using namespace std;
#include <iostream>
 
using namespace std;

????????????

Podobne pytania

0 głosów
1 odpowiedź 334 wizyt
pytanie zadane 9 lutego 2020 w C i C++ przez Konrad Gałach Użytkownik (880 p.)
+2 głosów
2 odpowiedzi 424 wizyt
pytanie zadane 8 sierpnia 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
2 odpowiedzi 6,027 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,575 zapytań

141,425 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...