为什么变量指针包含相同数据类型的地址?

时间:2014-05-12 21:26:11

标签: c++ c pointers memory memory-address

指针声明的一般语法:data-type *pointer_name;

指针是一个变量,其值是另一个变量的地址,即存储单元的直接地址。与任何变量或常量一样,必须先声明指针,然后才能使用它来存储任何变量地址。指针的数据类型必须与指针指向的变量相同。

为什么指针变量应该包含相同数据类型的变量的地址这一点很重要?

由于指针与另一个变量的值无关,为什么整数指针的浮点数据类型变量的地址是什么?

正确的表格:

  

int a = 10;

     

int * ptr =& a;

错误,类型不匹配

  

浮动a;

     

int * ptr; ptr =& a;

6 个答案:

答案 0 :(得分:4)

在回答之前,让我问你,如果它有效,你会用这样的指针做什么?

假设您(在函数内)

float a;
int *ptr; ptr = &a;

*p = 1;
++*p;
return *p;

在这种情况下,没有理由不使用int变量,如果它是您想要的int

假设您(在函数内)

float a;
int *ptr; ptr = &a;

a = 3.14;
++*p;
return a;

在这种对象别名中,可以有一个用途,但允许这样的构造对于编译器来说是一种痛苦。编译器可以自由地假设,有些人认为*p的修改对a的值没有影响,所以仍然不会修改3.14;

如果后一种情况是你正在寻找的东西,你可以使用union,它可以让你的代码更清晰地给其他读者,并使你的代码更清晰:

union {
  float f;
  int i;
} u;
u.f = 3.14;
++u.i;
return u.f;

所以,回答:它是为了防止你在脚下射击自己。它是不允许的,因为这样的指针无法使用。 可以有用的一种情况实际上是它不起作用的情况,并且有另一种语言构造可以处理它,并正确处理它。

答案 1 :(得分:2)

因为当你增加像

这样的指针时
ptr++;

它将指向一个与数据类型的大小相乘的地址。如果你这样做

ptr+=2;

并且数据类型占用4个字节,如果指针被声明为

,则会出现这种情况
float *ptr;

指针将以8个字节的位置增加。

答案 2 :(得分:2)

这是一项安全功能。指向另一个变量的一种类型的指针是灾难的处方;它几乎没有合法的目的,几乎你用它做的任何事情都是危险的,特别是如果类型的大小不同。

您可以通过强制转换覆盖此功能。如果你这样做,你就不能再声称你不知道自己在做一些危险的事情。

答案 3 :(得分:2)

还有一个解除引用指针的简单问题。

something = * pointer;

取消引用指针时应读取多少数据?编译器必须知道数据类型才能对数据执行操作,如fetch,add等。

答案 4 :(得分:1)

对于指向任何数据类型的指针, :这正是void指针的用途。您可以使用void *指向任何数据类型 1 ,然后您可以返回原始指针。

float f = 1.0f;
int i = 12;

void *p = &f;
p = &i;

当然,如果没有先将void指针强制转换回正确的指针类型,就不能取消引用它。您可以确保指针类型正确。

// In C, this is valid: implicit conversions to void * and back.
float f = 1.0f;
void *p = &f;
float *fp = p;
printf("*fp = %f\n", *fp);

// In C++, you have to use a cast:
float *fp = static_cast<float *>(p);

Void指针有局限性:你不能取消引用它们,也不能做任何指针运算。

1 :不应将函数指针强制转换为void *

答案 5 :(得分:0)

让我们用一个例子来理解它。

int main()
{
    char i = 8;
    int *ptr = &i;
    printf("Value of i = %d", *ptr);
    return 0;
}

Ans:它会打印一些垃圾,因为它在内存中取消引用了4个字节。 所以如果你做char *ptr = &i;,它将取消引用1个字节,依此类推。 它会给出正确答案。