为什么变量指针包含相同数据类型的地址?
Why do variable pointers contain the address of the same data type?
指针声明的通用语法: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字节,以此类推。它会给出正确答案。
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 数据对齐:限制内存地址为数据类型大小倍数的原因
- 默认的64位地址数据类型在Windows上
- 引用数据类型的 & 符号是否返回引用本身的地址或它所引用的值
- 在C/ c++或任何其他类似语言中,对变量或数据类型应用&符号时返回的地址类型
- 为什么变量指针包含相同数据类型的地址?
- 分配具有不同数据类型地址的指针而不进行强制转换