指针的值

Value Of Pointers

本文关键字:指针      更新时间:2023-10-16

在我的书中,指针是地址并且有一个数值。可以打印出指针的值,如cout <<(无符号长)(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;

假设这是你有问题的指针算术,让我试着用一种更"图形化"的方式来展示它是如何完成的:

假设我们有一个指针变量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

在指针上加1时,指向"数组"中的下一个元素。

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

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

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

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

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