我有一个问题
const int a=10;
int *ptr;
ptr = (int *)&a;
上面第三行中(int *)的用法是什么。
如上所述,如果我们有
char str[]="abc";
char *pc;
pc = str;
是上述转让权,如果是,那么为什么不是第一种情况。
答案 0 :(得分:2)
如果没有该演员表,您将收到编译器警告。 & a是一个const int *而不是一个int *。
答案 1 :(得分:2)
“const int a”是一个常量整数。它无法修改。如果您尝试分配给它,编译器将不会让您。如果您成功地使用技巧来绕过编译器,您的程序可能会崩溃或更糟。
“int * ptr”是指向非常数整数的指针。如果你写了一个作业“* ptr = 100;”编译器将允许它没有任何问题。如果ptr是空指针或未定义,则会崩溃或更糟。如果ptr指向非常数整数,它将为该整数分配100。如果ptr指向一个常数整数,它将崩溃或更糟。
因此,编译器不允许您将a的地址分配给p。因为它要求麻烦。
现在分配“ptr =(int *)& a;”。 & a是a的地址。 a是常数整数,& a是指向常数整数的指针。 (int *)是强制转换。您告诉编译器将& a转换为“指向int的指针”。因为它是指向int的指针,而不是指向const int的指针,所以可以将它指定给ptr。但是ptr指出的东西仍然是一个,它仍然是不变的。
如果您读取 * ptr,这将正常工作。读* ptr将给出数字10.写入* ptr,如* ptr = 100,将崩溃或更糟。基本上,通过使用演员你告诉编译器“闭嘴,我知道我在做什么”。你最好做。
答案 2 :(得分:2)
- > const int i = 10;
i
存储在只读区域中。(基本上告诉编译器该值不能更改)
i
的类型为"const int"
,&i
的类型为"const int *"
。
因此需要进行类型转换。
int *ptr = (int *)&i;
与之匹配
你可以通过声明如下来避免它
`int const *ptr = &i;`
p is of type "const int"
,类型不匹配
----------更新了您的查询-------
指向常量的指针可以通过以下两种方式声明。
1)const int *ptr;
要么
int const *ptr;
两者都相同。
但不是这个---> 2)int *const ptr;
与1st相同,这是指向变量的常量指针。
在案例1中)我们可以将指针更改为指向任何其他integer variable
,但不能使用指针ptr更改value of object
(实体)指向。
在案例2中)我们可以更改指针指向的value of object
,但不能更改pointer to point another variable
。
答案 3 :(得分:0)
你需要强制转换,因为你忘了将ptr声明为指向常量int的指针:
int const *ptr;