2016-09-16 19 views
0

在我的书中,它指出指针是地址并且有一个数值。您可以将指针的值打印为cout < <(unsigned long)(p) 编写代码以比较p,p + 1,q和q + 1。解释结果,我不知道这本书要我怎么做,所以这里是我的。有谁知道如果我这样做是正确的指针值

int num = 20; 
double dbl = 20.0; 
int *p = &num; 
double *q = &dbl; 
cout << (unsigned long)(q) << endl; 
q = q + 1; 
cout << (unsigned long)(q) << endl; 

cout << (unsigned long)(p) << endl; 
p = p + 1 ; 
cout << (unsigned long)(p) << endl; 
+1

虽然在大多数实现中,'unsigned long'和一个指针的大小是相同的,但如果它宣称您总是可以使用强制类型转换为'unsigned long'来打印指针,那么您的书是错误的。打印指针的正确方法是将其转换为void *'。 –

+0

你在做这件事时有什么疑问? –

+1

@JoachimPileborg'void *'强制转换甚至是必要的吗? –

回答

3

假设它是你有问题的指针运算,让我尝试到展示它是如何在更多的“图形”的方式完成:

比方说我们有可变ptr一个指针,它指向整数数组,像

int array[4] = { 1234, 5678, 9012, 3456 }; 
int* ptr = array; // Makes `ptr` point to the first element of `array` 

在内存方面,它看起来像

 
+------+------+------+------+ 
| 1234 | 5678 | 9012 | 3456 | 
+------+------+------+------+ 
^ ^ ^ ^
|  |  |  | 
ptr ptr+1 ptr+2 ptr+3 

首先是技术上ptr+0

向指针添加一个指针时,您将转到“数组”中的下一个元素。

也许现在你开始看到指针算术和数组索引之间的一些相似之处。这是因为这里的一个共同线程:对于任何指针或数组p和有效索引i,表达式p[i]*(p + i)完全相同。

使用p[i]等于*(p + i)的知识可以更容易理解数组如何用作指向其第一个元素的指针。我们从指向array(如上定义)的第一个元素的指针开始:&array[0]。这等于表达式&*(array + 0)。地址 - (&)和取消引用(*)运营商取消每个,使我们与(array + 0)。将零添加到任何东西都可以被删除,所以现在我们有(array)。最后我们可以删除括号,让我们用array。这意味着&array[0]等于array

+1

你甚至可以写i [p],它将被转换为*(i + p),它产生相同的对象,甚至是-1 [p + size],以获得数组的最后一个元素。 –

1

如果你想要打印你的指针指向的地址的十进制表示,你做得对。

如果您想知道,为什么结果如此,您需要学习指针算术。如果您将1添加到任何指针,它的地址将会增加sizeof(<type>),其中type您的指针指向的变量的类型为

因此,如果您有一个指向int的指针并将其增加,则地址将增加sizeof(int),这很可能是四。