给定架构时,任何类型指针占用的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)。
那么,不同类型的高阶指针是否存在差异?
答案 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)
。
因此,指针的指针与简单指针的类型不同......这就是全部。