不同类型的双(或更高阶)指针是否有任何差异?

时间:2016-04-20 12:40:49

标签: c pointers

给定架构时,任何类型指针占用的AFAIK大小相同。也就是说,不同类型的指针之间的唯一区别是当我们在指针上使用诸如ptr++ptr--之类的操作时会发生什么。

举个例子:

char *cptr;

int *iptr;

占用相同数量的内存(例如4个字节,或8个字节或其他内容)。但是,不同之处在于我们在指针上使用递增(或递减)运算符时会发生什么。 cptr++会将cptr增加1,而iptr++会将iptr增加4(取决于架构,它也可以是不同于4的值)。

问题

我的问题是,之间是否有任何区别:

char **cdptr;

int **idptr;

(假设对于提到的机器,指针的大小为4个字节)

由于两者都是指针,因此两者都占用相同的空间:4个字节。此外,由于两者都指向占用相同大小的内容(同样,4个字节),因此操作char cdptr++int idptr++将在这两个指针上完全相同(分别将它们递增4)。

那么,不同类型的高阶指针是否存在差异?

2 个答案:

答案 0 :(得分:2)

从形式上讲,是的,这些指针类型是不同的。它们具有不同的类型,类型对程序员来说很重要,而编译器则保持密切关注。你可以通过尝试编译来证明它们是不同的

char **cdptr;
int **idptr = NULL;

cdptr = idptr;

您的编译器会抱怨。 (gcc说“从不兼容的指针类型中分配”。)你也可以通过注意间接对它们发生的事情来说服自己是不同的:cdptr[1][2]当然是一个字符,而idptr[1][2]是一个int。

现在,这是真的,因为sizeof(*cdptr)几乎肯定等于sizeof(*idptr),像cdptr++idptr++这样的指针算法将生成相同的代码。但这并没有让我觉得这是一个非常有用的事实 - 如果我们宣布

这就像观察它一样有趣
int *iptr;
char **cdptr;

我们在一个机器上得到iptr++cdptr++的相同代码,其中整数和指针的大小相同。但这并没有告诉我们在编写C程序时我们可以使用的任何东西。 “增加时生成相同的代码”不等于“相同”。

答案 1 :(得分:0)

基本上,在C语言中,指针不仅仅是一个内存地址。它是内存地址类型

使用指针算术时需要该类型。例如:ptr + 2表示您将指针在内存中的当前位置移动2 sizeof(pointed type by ptr)

因此,指针的指针与简单指针的类型不同......这就是全部。