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

Why do variable pointers contain the address of the same data type?

本文关键字:地址 数据类型 变量 指针 包含相 为什么      更新时间:2023-10-16

指针声明的通用语法:data-type *pointer_name;

指针是一种变量,它的值是另一个变量的地址,即内存位置的直接地址。像任何变量或常量一样,在使用指针存储任何变量地址之前,必须声明指针。指针的数据类型必须与指针所指向的变量相同。

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

作为一个指针与另一个变量的值无关,为什么整型指针不能有浮点数据类型变量的地址?

正确的形式:

int a = 10;

int *ptr = &a;

错误,类型不匹配

浮动;

int * ptr;PTR = &a;

因为当你增加一个指针,比如

ptr++;

将指向1乘以数据类型大小的地址。如果你这样做

ptr+=2;

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

就会出现这种情况
float *ptr;

指针将增加8个字节。

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

假设你有(函数内部)

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;

所以,回答:这是为了防止你搬起石头砸自己的脚。这是不允许的,因为这样的指针是没有用的。可以有用的一种情况实际上是它不起作用的情况,并且有另一种语言结构可以处理它,并且正确地处理它。

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

something = *pointer;

当指针解引用时应该读取多少数据?编译器必须知道数据类型,以便对数据执行fetch、add等操作。

这是一个安全功能。一种类型的指针指向另一种类型的变量会导致灾难;它几乎没有合法的用途,你用它做的几乎任何事情都是危险的,尤其是当类型大小不同的时候。

你可以通过强制转换来覆盖这个特性。如果你这样做了,你就不能再声称你不知道自己在做危险的事情。

指针指向任何数据类型是可能的:这正是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 = %fn", *fp);
// In C++, you have to use a cast:
float *fp = static_cast<float *>(p);

Void指针有一些限制:不能对它们解引用,也不能做任何指针运算。

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

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

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

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