Consider the following piece of code.
int var;
cout << (long)&var;
My doubt is how do we know that long int has sufficient width to hold the memory location indicated by &var. What if it is not sufficient?
The full code which I am executing…
//: C03:YourPets2.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include <iostream>
using namespace std;
int dog, cat, bird, fish;
void f(int pet) {
cout << "pet id number: " << pet << endl;
}
int main() {
int i, j, k;
cout << "Address size " << sizeof(&f) << endl;
cout << "Long size " << sizeof(long) << endl;
cout << "Intptr size " << sizeof(intptr_t) << endl;
cout << "f(): " << &f << endl;
cout << "f(): " << (long)&f << endl;
cout << "f(): " << (long long)&f << endl;
cout << "dog: " << (long)&dog << endl;
cout << "cat: " << &cat << endl;
cout << "bird: " << &bird << endl;
cout << "fish: " << (long)&fish << endl;
cout << "i: " << (long)&i << endl;
cout << "i: " << (long long)&i << endl;
cout << "j: " << (long)&j << endl;
cout << "k: " << (long)&k << endl;
} ///:~
The result which I am getting:
Address size 4
Long size 4
Intptr size 4
f(): 1
f(): 134514548
f(): 134514548
dog: 134521044
cat: 0x804a0d8
bird: 0x804a0dc
fish: 134521056
i: -1074729380
i: -1074729380
j: -1074729384
k: -1074729388
You don’t. It’s possible – if unlikely – for pointers to have larger storage requirements than any integer. If there is an integer type that is suitable then there will be a typedef for it
std::intptr_t(and possible alsostd::uintptr_t) defined in<cstdint>(C++11 only).You can test for the presence of
intptr_tat the preprocessor stage by testing for the definedness of the macroINTPTR_MAX(orINTPTR_MIN) after#include <cstdint>.If you just want to print a pointer value using
std::coutthen you can cast tovoid*(unnecessary forint*but necessary forchar*) and use<<directly without a cast to an integer type.