C++ 为什么要指定指针类型?

C++ 为什么要指定指针类型?,c++,c,pointers,C++,C,Pointers,声明特定类型的指针时实际会发生什么?除了指针算术或索引之外,还可以为指针指定类型吗?原因之一可能是,当您取消引用指针时,我们应该知道正确读取的字节数?取消引用char指针意味着从内存中提取一个字节,而对于int则可能是4个字节。取消引用指针时需要数据类型,以便它知道应该读取多少数据 例如:取消对char指针的引用应该从它所指向的地址读取下一个字节,而int指针应该读取两个字节 有关详细信息,请参阅此文档:指针是一个变量,其值是另一个变量的地址 以下是指针类型的几个示例: int *ip;

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

原因之一可能是,当您取消引用指针时,我们应该知道正确读取的字节数?取消引用
char
指针意味着从内存中提取一个字节,而对于
int
则可能是4个字节。

取消引用指针时需要数据类型,以便它知道应该读取多少数据

例如:取消对char指针的引用应该从它所指向的地址读取下一个字节,而int指针应该读取两个字节


有关详细信息,请参阅此文档:

指针是一个变量,其值是另一个变量的地址

以下是指针类型的几个示例:

int    *ip;    /* pointer to an integer */

double *dp;    /* pointer to a double */

float  *fp;    /* pointer to a float */

char   *ch     /* pointer to a character */

所有指针的值的实际数据类型,无论是整数、浮点、字符还是其他类型,都是相同的,一个表示内存地址的长十六进制数


不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型,指针也指向类的有效对象。如果没有类型,则无法获取访问类成员的信息

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 ?

在以下情况下需要指针的类型

  • 取消对指针的引用
  • 指针算法
下面是取消引用指针的示例

{
    char *ptr; //pointer of type char
    short j=256;
    ptr=&j;    // Obviously You have to ignore the warnings
    printf("%d",*ptr)
}
现在,因为
ptr
是char类型,所以它只能读取一个字节。但是256的二进制值是
0000000 100000000
,但是因为
ptr
char
类型,所以它将只读取第一个字节,因此输出将是
0

注:若我们指定j=127,那个么输出将是127,因为127将被第一个字节保持

现在,以
指针算法
为例:

{
    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
    与写入1字节的
    long
    不同≥ 4个八位组
  • 对齐:两种类型可能长度相同,但对齐方式不同。一种数据类型可能被放入一个特殊的寄存器中,并且从这些寄存器移动/移动到这些寄存器的内存具有特殊的对齐要求
  • 表示法:即使与
的大小相同,表示法也可能不同。如果您分配一个
*float\u ptr=4
,则
4
将转换为
4.0
  • 类型安全:严重不当行为,如
    void**ptr1、**ptr2*ptr1+*ptr2

  • 没有类型,您如何知道指针指向什么?如何通过指针将数据写入内存位置,而不知道该位置分配给的数据类型?相关或重复:您可以指定指针指向未知类型的对象:
    void*ptr试着在整个程序中使用它,并告诉我们你已经走了多远。这对定义都很好。我想问题更多的是关于指针的用法,也就是你在了解数据类型后得到的结果?“所有指针的值的实际数据类型,…是相同的”。那不一定是真的。字寻址机器可以使用一种数据类型作为字地址(通常包括整数、浮点和结构指针),使用另一种数据类型作为字地址+字内偏移量(包括字符指针和空指针)。分段架构通常使用不同类型的“指向函数的指针”,最后还有“指向成员的指针”/“指向成员函数的指针”的所有乐趣和游戏,它们是完全不同的野兽。仅此而已?我认为答案是“因为你必须”-
    autox=*ptr
    func(*ptr)..@LogicStuff抱歉,我不确定我是否在跟踪您。如果你觉得有什么不足,请考虑增加另一个答案。我也主要是从C的角度来回答这个问题,因为这个问题也有这样的标记。哦,好吧。我只是说问题下的第一条评论是什么。