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

Storing Address of a character to an Integer Pointer

本文关键字:整数 指针 存储 地址 字符      更新时间:2023-10-16

正如我们所知,指针(在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::anyboost::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字节的地址。