递增指针时带或不带星号
With or without an asterisk when incrementing pointer
本文关键字:指针 更新时间:2023-10-16
>在 cplusplus.com 教程中的"void 指针"示例中,我尝试像下面这样进行比较。为什么我们还需要括号中的*
?没有*
时会发生什么?
void increase(void* data, int psize) {
if (psize == sizeof(char)) {
char* pchar;
pchar = (char*) data;
cout << "pchar=" << pchar << endl;
cout << "*pchar=" << *pchar << endl;
//++(*pchar); // increases the value pointed to, as expected
++(pchar); // the value pointed to doesn't change
} else if (psize == sizeof(int)) {
int* pint;
pint = (int*) data;
//++(*pint); // increases the value pointed to, as expected
++(pint); // the value pointed to doesn't change
}
}
int main() {
char a = 'x';
int b = 1602;
increase(&a, sizeof(a));
increase(&b, sizeof(b));
cout << a << ", " << b << endl;
return 0;
}
接受解决方案后更新)我试图根据@Cody格雷的回答来澄清我没有得到什么。pchar
的地址递增以指向无意义的位置。但是因为main
中的变量a
是cout
ted 而不是 pchar
,这个cout
仍然打印一个有点有意义的值(在这个例子中,它将是'x')。
*
运算符取消引用指针。
因此,此代码:
++(*pint)
递增 pint
指向的值。
相比之下,此代码:
++(pint)
递增指针本身,pint
。这就是指针指向的值不会更改的原因。您不会更改指针指向的值,而是更改指针本身的值。
递增指针将导致它指向内存中完全不同的值。在这种情况下,由于您只为单个整数分配了空间,因此它将指向一个无意义的值。
当您从指针到其他指针进行强制转换时
char* pchar;
pchar = (char*) data;
您告诉编译器将此内存作为 char 指针处理,您可以在其中对此变量执行指针算术。因此,您不仅仅使用指针来处理指针的值,这是您在其中进行算术的内存地址。
要使用值,您需要使用"*"或通过字符访问内存指针。
相关文章:
- 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文件中的矢量时出错