为什么要指定指针类型

Why to specify a pointer type?

本文关键字:指针 类型 定指 为什么      更新时间:2023-10-16

声明特定类型的指针时实际会发生什么?除了指针"算术"或"索引"之外,指定指针的类型有什么用吗?

其中一个原因可能是,当您取消引用指针时,我们应该知道正确读取多少字节?取消引用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,但由于ptrchar类型,因此它将只读取第一个字节,因此输出将是0

注意:如果我们指定j=127,那么输出将是127,因为127将由第一个字节保持。

现在,以pointer arithmetic:为例

{
    int *ptr;
    int var=0;
    ptr=&var;
    var++;
    ptr++;// pointer arithmetic
}

语句var++ptr++是同一事物吗?否,var++表示var=var+1ptr++表示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 ?
相关文章: