指针类型转换 C++
Pointer typecasting c++
#include <iostream>
#define print(x) std::cout << x;
#define println(x) std::cout << x << std::endl;
int main() {
int ex[5];
int* ptr = ex;
for (int i = 0; i < 5; i++) {
ex[i] = 2;
}
ex[2] = 3;
*(int*)((char*)ptr + 8) = 4;
println(ex[2]);
}
在第 13 行我正在使用 (char*),当我 运行 println(sizeof(char*))
它说它是 4 个字节但我的老师说它是 1 个字节长所以我们需要添加 8字节来访问 ex[2] 中的值,这怎么可能我不明白! :/
这取决于您使用的架构。根据定义,char 是大小为 1 的类型,因此 sizeof(char) 的计算结果为 1,但它并不自动意味着它是 8 位。
要访问下一个值,您必须将 sizeof(int) 添加到指针以使您的代码独立于使用它的体系结构工作。
当你使用指针时,你告诉编译器指针指向的值在内存中采用该类型的space,内存中的下一个东西应该在那个数量的单位之后(字节)。因此,如果将 int 指针转换为 char 指针,则应将 sizeof(int) 添加到 char 指针,以获得与将 1 添加到 int 指针相同的效果。这是因为根据定义,char 自动为 1 个单位,如果您使用 char 以外的任何东西,这是行不通的,没有体系结构独立的类型大小规范。
#include <iostream>
#define print(x) std::cout << x;
#define println(x) std::cout << x << std::endl;
int main() {
int ex[5];
int* ptr = ex;
for (int i = 0; i < 5; i++) {
ex[i] = 2;
}
ex[2] = 3;
*(int*)((char*)ptr + 8) = 4;
println(ex[2]);
}
在第 13 行我正在使用 (char*),当我 运行 println(sizeof(char*))
它说它是 4 个字节但我的老师说它是 1 个字节长所以我们需要添加 8字节来访问 ex[2] 中的值,这怎么可能我不明白! :/
这取决于您使用的架构。根据定义,char 是大小为 1 的类型,因此 sizeof(char) 的计算结果为 1,但它并不自动意味着它是 8 位。
要访问下一个值,您必须将 sizeof(int) 添加到指针以使您的代码独立于使用它的体系结构工作。
当你使用指针时,你告诉编译器指针指向的值在内存中采用该类型的space,内存中的下一个东西应该在那个数量的单位之后(字节)。因此,如果将 int 指针转换为 char 指针,则应将 sizeof(int) 添加到 char 指针,以获得与将 1 添加到 int 指针相同的效果。这是因为根据定义,char 自动为 1 个单位,如果您使用 char 以外的任何东西,这是行不通的,没有体系结构独立的类型大小规范。