将字符的地址存储到整数指针
Storing Address of a character to an Integer Pointer
正如我们所知,指针(在C++中(的任务是存储地址。地址的大小取决于计算机体系结构。对于这个例子,让我们假设我们有一台32位的机器,地址的大小是4字节。现在,如果我们创建一个整数指针
int x=20;
int * ptr;
ptr = &x; // This is fine the address of x is of 4-Bytes
类似地,如果我们有一个字符c
char c='a';
ptr = &c; // This puts an error although address size of &c is still 4-Byte.
指针的任务是存储地址,然后为什么ptr不存储字符的地址。虽然整数和字符的地址都是4-Bytes。没有地址的数据类型,那么它不应该将地址保存在ptr(指针(中吗?
问题不在于指针变量的大小错误。这个问题属于类型安全问题。您正在声明指针变量包含int
的地址。这意味着当您试图传递char
的地址时,编译器会抱怨。上面写着,"你答应给我一个int的地址,但那是一个char的地址"。
编译器没有试图保护您免受存储地址的问题。正如你所注意到的,没有。编译器保护您免受的问题是当您取消引用地址时出现的问题。
想想当你试图取消引用指针时会发生什么。如果
int * ptr;
char c='a';
ptr = &c;
起作用了,会怎么做
int d = *ptr;
放入d
?事实上,由于int
是4个字节,而char
只有1个字节,因此从d
读取会产生垃圾,而向其写入会污染随后的3个字节。
如果在第二种情况下将ptr定义为
char *ptr;
那么它将编译。正如您所说,指针仍然是32位体系结构上的4个字节。编写char*的原因只是为了澄清您的指针指向的是一个char类型。这使您的代码不那么容易出错,可以很容易地指向结构/类成员等。
理论上,你当然可以将char指针转换为int指针,它们都是指针。但这是不正确的,因为您指向的数据不是整数。
基本上是为了确保某种类型的安全,即使void*
总是破坏聚会。正如您在这个小示例中所看到的,指向void
的指针可以完成您想要的操作:
int main() {
int x = 0;
char y = 'a';
void* ptr = &x;
ptr = &y;
}
但它是C-ism,您可能应该使用boost::any
或boost::variant
来表达不同类型的变量。
如果您真的想这样做,请尝试类型转换。。。但我敢打赌,你会遇到很多麻烦。。。
ptr = (int *)&c;
因为存在类型
如果允许:
char x = '!';
int* ptr = &x;
则表达式*ptr
的类型将是int
,这是错误的,因为指针指向的是char
,而不是int
。
char c='a';
int * ptr;
ptr = &c;
printf("%d",*ptr);
上面给出了print输出中*ptr的垃圾值,因为我们声明指针变量包含int的地址。这意味着,当你试图传递一个字符的地址时,编译器会说指针是整数类型的,所以我们只需要传递整数地址,但我们传递的是一个1字节的字符的地址,但整数指针指向4字节的地址。
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 整数指针数组的元素是否可以指向整数数组?
- 整数指针与字符指针的情况下悬空指针
- 整数指针数组的大小
- 使用整数指针将左值转换为右值
- 打印整数指针元素时的结果不同
- 将空间分配给整数指针时出错
- 异常包括字符指针和整数指针
- 我可以在 c++ 中使用整数指针调用类的成员函数吗?
- 为什么我们不能使用整数指针声明一个数字数组
- 当我们在 c++ 中将常量整数引用分配给整数指针时,行为是什么
- 为什么允许常量整数指针指向非常量整数
- 在C++中为整数指针编制索引
- 创建字符指针和整数指针数组
- 指向整数指针的 C++ 指针
- 字符结果和整数指针之间的差异
- 删除整数指针时析构函数末尾的分段错误
- 是否可以将整数指针转换为位于该内存位置的实际整数
- 将树的每个节点替换为节点左侧所有值的和,而不使用额外的整数指针参数
- 我允许传递一个整数指针到一个函数,在c++中接受一个整数数组作为参数