gpt4 book ai didi

c - 不同类型的双(或高阶)指针有什么区别吗?

转载 作者:行者123 更新时间:2023-11-30 20:12:14 25 4
gpt4 key购买 nike

据我所知,任何类型的指针占用的大小在给定架构上都是相同的。也就是说,不同类型指针之间的唯一区别在于当我们对指针使用诸如 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)。

那么,不同类型的高阶指针有什么区别吗?

最佳答案

从形式上来说,是的,这些指针类型是不同的。它们有不同的类型,这些类型对程序员很重要,并且编译器会密切跟踪。您可以通过尝试编译来证明它们是不同的

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

cdptr = idptr;

你的编译器会提示。 (gcc 说“来自不兼容指针类型的赋值”。)您还可以通过注意间接调用它们时发生的情况来说服自己它们是不同的: cdptr[1][2]当然是一个字符,而idptr[1][2]是一个整数。

现在,这是真的,因为 sizeof(*cdptr)几乎肯定等于 sizeof(*idptr) ,指针算术如 cdptr++idptr++将生成相同的代码。但这对我来说并不是一个非常有用的事实——它与观察如果我们声明一样有趣

int *iptr;
char **cdptr;

我们得到了相同的代码 iptr++cdptr++在整数和指针大小恰好相同的机器上。但这并没有告诉我们在编写 C 程序时可以使用的任何内容。 “递增时生成相同的代码”不等于“相同”。

关于c - 不同类型的双(或高阶)指针有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com