我们知道指针(In 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(指针)中吗?
答案 0 :(得分:2)
问题不在于指针变量的大小错误。问题是类型安全问题。您声明指针变量包含int
的地址。这意味着当您尝试传递char
的地址时,编译器会抱怨。它说,"你答应给我一个int的地址,但这是一个字母的地址"。
编译器并未尝试保护您免受存储地址的问题。如你所知,没有。编译器保护您的问题是当您取消引用地址时出现的问题。
答案 1 :(得分:2)
想想当你试图取消引用指针时会发生什么。如果
int * ptr;
char c='a';
ptr = &c;
工作,会是什么
int d = *ptr;
输入d
?实际上,由于int
是4个字节但char
只有1,因此从d
读取会产生垃圾,写入它会污染后续的3个字节。
答案 2 :(得分:1)
如果在第二种情况下将ptr定义为
char *ptr;
然后那将编译。正如你所说,指针仍然是32位架构上的4个字节。写char *的原因只是为了澄清你的指针指向一个char类型。这使得您的代码减少了错误,使得可以轻松指向结构/类成员等。
理论上,你当然可以将你的char指针转换为int-pointer,它们都是指针。但这并不正确,因为您指向的数据不是整数。
答案 3 :(得分:0)
基本上要确保某种type safety,即使void*
总是破坏派对。在这个小例子中,you can see为void
指向您正在寻找的内容:
int main() {
int x = 0;
char y = 'a';
void* ptr = &x;
ptr = &y;
}
但它是一个C-ism,你应该使用boost::any
或boost::variant
来表达一个可以是不同类型的变量。
答案 4 :(得分:0)
如果你真的想这样做,请尝试输入...但我可以打赌你会遇到很多麻烦......
ptr = (int *)&c;
答案 5 :(得分:0)
因为类型存在。
如果允许的话:
char x = '!';
int* ptr = &x;
然后表达式*ptr
的类型为int
,这是错误的,因为指针指向char
,而不是int
。
答案 6 :(得分:0)
char c='a';
int * ptr;
ptr = &c;
printf("%d",*ptr);
上面给出了print输出中* ptr的垃圾值,因为我们声明指针变量包含int的地址。这意味着当你尝试传递一个char的地址然后编译器说指针是整数类型所以我们只需要传递整数地址但是我们传递一个字符的地址,该字符是1个字节但整数指针指向4字节地址。