为什么要指定指针类型
Why to specify a pointer type?
声明特定类型的指针时实际会发生什么?除了指针"算术"或"索引"之外,指定指针的类型有什么用吗?
其中一个原因可能是,当您取消引用指针时,我们应该知道正确读取多少字节?取消引用char
指针意味着从内存中取出一个字节,而对于int
,它可能是4个字节。
在以下情况下需要指针类型
- 取消引用指针
- 指针算术
以下是取消引用指针的示例。
{
char *ptr; //pointer of type char
short j=256;
ptr=&j; // Obviously You have to ignore the warnings
printf("%d",*ptr)
}
现在因为ptr
是char类型,所以它只读取一个字节。但256的二进制值是0000000100000000
,但由于ptr
是char
类型,因此它将只读取第一个字节,因此输出将是0
。
注意:如果我们指定j=127,那么输出将是127,因为127将由第一个字节保持。
现在,以pointer arithmetic
:为例
{
int *ptr;
int var=0;
ptr=&var;
var++;
ptr++;// pointer arithmetic
}
语句var++
和ptr++
是同一事物吗?否,var++
表示var=var+1
,ptr++
表示ptr=ptr+4
。因为编译器"知道"这是一个指针,并且它指向int
,所以它将4
添加到ptr
而不是1,所以指针"指向"下一个整数。
-
大小:您可以访问多少字节?读/写一个1字节的
char
与写一个≥4个八位位组的long
不同 - 对齐:两种类型的长度可能相同,但对齐方式不同。一种数据类型可能被放入一个特殊的寄存器中,从这些寄存器到这些寄存器的内存移动有特殊的对齐要求
-
表示:即使使用相同的
sizeof
和_Alignof
,表示也可能不同。如果指定了*float_ptr = 4
,则4
将转换为4.0
-
类型安全:可以检测到像
void **ptr1, **ptr2; *ptr1+*ptr2;
这样的严重不当行为
指针是一个变量,其值是另一个变量的地址
以下是指针类型的几个示例:
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
所有指针值的实际数据类型,无论是整数、浮点、字符还是其他类型,都是相同的,是一个表示内存地址的长十六进制数。
不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型
取消引用指针时需要Data类型,以便它知道应该读取多少数据。
例如:取消引用char指针应该从它所指向的地址读取下一个字节,而int指针应该读取两个字节。
请参阅以下内容了解更多信息:为什么有必要声明指针指向的类型?
指针还指向类的有效对象。如果没有类型,就无法获取访问类成员的信息。
class CPerson
{
public:
std::string GetName();
};
CPerson oPerson;
CPerson *pObj_1 = &oPerson;
pObj_1->GetName();
void *pObj_2 = &oPerson;
pObj_2-> ?? // what all I can access now ?
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?