字符指针不递增?
char pointer doesn't increment?
在指针不递增之后ptr++
1 #include<iostream>
2
3 int main() {
4
5 char *ptr;
6 char ch = 'A';
7 ptr = &ch;
8
9 std::cout << "pointer :" << &ptr << "n";
10 ptr++;
11 std::cout << "pointer after ++ :" << &ptr << "n";
12 return 0;
13 }
ikar$ g++ pointer_arth.cpp
ikar$ ./a.out
pointer :0x7ffeed9f19a0
pointer after ++ :0x7ffeed9f19a0
ikar$
您正在增加指针,但输出保存指针本身的变量的地址(&ptr
(。您应该只输出ptr
(并相应地格式化 - 请参阅下面的编辑(。
例:
#include <iostream>
int main() {
char data;
char *ptr = &data;
std::cout << "pointer:" << (unsigned long long)ptr << std::endl;
ptr++;
std::cout << "pointer incremented: " << (unsigned long long)ptr << std::endl;
}
输出:
pointer:140732831185615
pointer incremented: 140732831185616
是的,打印ptr
就会输出垃圾,所以我将指针转换为整数(因为指针无论如何都是内存地址(。
如注释中所建议的,您可以在打印时将指针投射到void *
,这样可以提供更好的格式:
pointer:0x7ffee5467acf
pointer incremented: 0x7ffee5467ad0
请注意如何0x7ffee5467acf == 140732745022159 != 140732831185615
- 每次运行时都会获得不同的输出,因为内核会将可执行文件加载到内存中的不同位置。
编辑:是的,这个答案的第一个版本,关于简单地用std::cout << ptr
输出ptr
,是不正确的,因为<<
运算符重载的方式是它将指向char
的指针视为 C 字符串。因此,该版本将访问可能无效的内存和输出垃圾。
但概念保持不变。指向int
的指针 ,例如,没有这个"问题",即使没有将它们转换为void *
也打印为十六进制数字:在线尝试!输出显示指针仍然正确递增sizeof(int)
,等于该计算机上的 4。
指针在代码中成功递增。 打印保存指针变量的位置地址。 实际上,如果打印"ptr",则字符-"A"之后是垃圾,您可以理解并指向这种未处理的内存位置不好。
相关文章:
- 指向指向字符数组的指针数组的指针
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将字符缓冲区强制转换为函数指针
- 在函数中返回无符号字符数组,但不返回指针
- 将字符逐个分配给指针?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将字符数组复制到 QByte 数组中,而无需传递指针
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- C++指针数组到字符数组中的特定位置
- 如何从链表指针字符中查找字符
- 获取字符数组地址,然后转换为指针字符
- 在指针字符 c++ 中分配字符数组的值
- C 指针字符
- 将向量传递<char>到指针字符*
- 如何修复未对齐的指针(字符**)
- 如何打印指针字符数组
- 指针 *字符和 &字符
- C++指针字符
- C/ c++:从指针字符一维数组中访问单个字符