Mub*_*mon 2 c c++ memory pointers memory-address
指针声明的一般语法: data-type *pointer_name;
指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量一样,您必须先声明一个指针,然后才能使用它来存储任何变量地址。指针的数据类型必须与指针指向的变量相同。
为什么指针变量应该包含相同数据类型的变量的地址很重要?
由于指针与另一个变量的值无关,为什么整数指针不能具有浮点数据类型变量的地址?
正确的形式:
整数 a = 10 ;
int *ptr = &a ;
错误,类型不匹配
浮动一个;
int *ptr; ptr = &a;
因为当你增加一个指针时
ptr++;
Run Code Online (Sandbox Code Playgroud)
它将指向一个地址,该地址是数据类型大小的一倍。如果你这样做
ptr+=2;
Run Code Online (Sandbox Code Playgroud)
并且数据类型占用 4 个字节,如果指针声明为
float *ptr;
Run Code Online (Sandbox Code Playgroud)
指针将增加 8 个字节位置。
小智 5
在回答这个问题之前,让我问你,如果它有效,你会用这样的指针做什么?
假设你有(在一个函数内)
float a;
int *ptr; ptr = &a;
*p = 1;
++*p;
return *p;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,完全没有理由不使用int变量(如果它是int您想要的)。
假设你有(在一个函数内)
float a;
int *ptr; ptr = &a;
a = 3.14;
++*p;
return a;
Run Code Online (Sandbox Code Playgroud)
在这种对象别名中,可以使用,但允许这样的构造对编译器来说是一种痛苦。编译器可以自由地假设,有些人确实假设, 的修改*p对 的值没有影响a,所以仍然返回 3.14 未修改;
如果您正在寻找后一种情况,您可以使用union,这既使您的代码对其他读者更清晰,并使您的代码对编译器更清晰:
union {
float f;
int i;
} u;
u.f = 3.14;
++u.i;
return u.f;
Run Code Online (Sandbox Code Playgroud)
所以,回答:这是为了防止你用脚射击自己。这是不允许的,因为这样的指针没有任何用处。它可能有用的一种情况实际上是它不起作用的情况,并且有另一种语言结构可以处理它并正确处理它。
| 归档时间: |
|
| 查看次数: |
3815 次 |
| 最近记录: |