Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符地址存储到整数指针_C++_Pointers - Fatal编程技术网

C++ 将字符地址存储到整数指针

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

正如我们所知,指针的任务(在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字节。没有地址的数据类型,那么它是否应该将地址保存在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以弥补损失。