指针的值
Value Of Pointers
本文关键字:指针 更新时间:2023-10-16
在我的书中,指针是地址并且有一个数值。可以打印出指针的值,如cout <<(无符号长)(p)编写代码比较p、p+1、q和q+1。解释一下结果,我不确定书上要我做什么,所以这是我有的。有人知道我这样做是否正确吗?
int num = 20;
double dbl = 20.0;
int *p = #
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。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错