C++ 将字符地址存储到整数指针
正如我们所知,指针的任务(在C++中)是存储地址。地址的大小取决于计算机体系结构。 对于这个例子,让我们假设我们有一个32位的机器,地址的大小是4字节。现在,如果我们创建一个整数指针C++ 将字符地址存储到整数指针,c++,pointers,C++,Pointers,正如我们所知,指针的任务(在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 alth
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字节。没有地址的数据类型,那么它是否应该将地址保存在ptr(指针)中?基本上是为了确保某种类型的,即使
void*
总是会毁了一方。在这个小示例中,指向void
的指针执行您正在查找的操作:
int main() {
int x = 0;
char y = 'a';
void* ptr = &x;
ptr = &y;
}
但它是一个C-ism,您可能应该使用
boost::any
或boost::variant
来表示一个可以是不同类型的变量。如果您确实想这样做,请尝试类型转换。。。但我敢打赌你会遇到很多麻烦
ptr = (int *)&c;
如果您在第二种情况下将ptr定义为
char *ptr;
然后就可以编译了。正如您所说,指针仍然是32位体系结构上的4个字节。编写char*的原因只是为了说明指针指向的是char类型。这使您的代码少了一些错误,可以轻松地指向结构/类成员等
理论上你当然可以把你的char指针转换成int指针,它们都是指针。但这是不正确的,因为您指向的数据不是整数。问题不在于指针变量的大小错误。这是一个类型安全问题。您正在声明指针变量包含
int
的地址。这意味着当您试图传递字符的地址时,编译器会抱怨。它说,“你答应给我一个int的地址,但那是一个char的地址”
编译器不会试图保护您避免存储地址时出现问题。正如你所注意到的,没有。编译器保护您不受的问题是当您取消引用地址时出现的问题 只要想一想,当你尝试去引用指针时会发生什么。如果
int * ptr;
char c='a';
ptr = &c;
成功了,你会怎么做
int d = *ptr;
放入d
?事实上,由于int
是4个字节,而char
只有1个字节,因此从d
读取将产生垃圾,向其写入将污染随后的3个字节 因为类型存在。
如果允许的话:
char x = '!';
int* ptr = &x;
然后表达式*ptr
的类型将是int
,这是错误的,因为指针指向的是char
,而不是int
char c='a';
int * ptr;
ptr = &c;
printf("%d",*ptr);
上面给出了打印输出中*ptr的垃圾值,因为我们声明指针变量包含int的地址。这意味着,当您尝试传递字符的地址时,编译器会说指针是整数类型,所以我们只能传递整数地址,但我们传递的是字符的地址它是1字节,但整数指针指向4字节的地址。您能再解释一下吗。谢谢,我不必这么做。我只是想知道为什么我不能存储地址,因为没有地址的数据类型。我只是想知道为什么语言不允许这样。谢谢,但我想约翰给了你正确的答案。我得到了它。非常感谢你的帮助。谢谢你的回答。它真的帮助了我。我说得对。ThanksPointers有数据类型。指针包含对象的地址,指针类型包含有关该对象的类型信息。从概念上讲,指针不仅仅是一个数字。编译器可以将指针实现为数字,因为编译器在编译程序时也会跟踪类型,但一旦编译完成,就不再需要这些信息(aka.C是静态类型0。既然你提到你现在更好地理解了这一点,别忘了点击旁边的绿色复选标记接受你的答案!这会给你和接受答案的人一些声誉分数。不知道否决票是怎么回事。我觉得你的答案很好…+1以弥补损失。