指针变量的数据类型是什么?

新手上路,请多包涵

我参考了以下链接,

链接 1 链接 2

在上面的链接1中,回答中提到了“ Pointers are of pointer type ”。

我只需要知道指针是否是数据类型。

没有人用一个词回答过这个问题。它是数据类型还是不是?

这是我提到的第二个链接说

指针只是一个保存地址的变量,因此人们可能会争辩说指针是一种数据类型,但它没有被定义为一种数据类型(根据“The C Programming Language”。Kernighan & Ritchie)。

原文由 VINOTH ENERGETIC 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 335
1 个回答

是的,指针是一种数据类型。其中最纯粹的形式(这里主要讲 C)是 void *void * 可用于传递内存地址(这就是指针),但不能取消引用。取消引用指针是为了获取指针指向的内存位置中包含的数据,这意味着您知道从内存中读取的数据类型。类型决定了将读取多少内存,因为 void“nothing” 。 A void * 可以设置为指向可以包含任何类型的任何内存块,因此您可以将 void * 转换为任何其他指针类型( int * ,例如),并取消引用它,而不是。

我们拥有的每种类型都用于存储特定的数据(值),我们使用 char 存储单个字符,使用 int 存储整数, double 存储双精度小数等。除了指针之外,这些类型都不用于在内存中存储位置。因此,就像其他类型一样,指针用于存储特定的数据。所有指针的母亲是 void *

可悲的是,这个 void * 相当受限制:你不能取消引用它,你不能将它用于指针运算(无论如何都不符合标准)。因此,C 为您提供了一系列派生指针类型,让生活更轻松: char *int *double * 等等。

他们是什么,真的,是简写: (char *) void * my_ptr;

更多尝试使我的观点尽可能清楚:

指针有自己的大小,与它们所指向的类型无关:

 char a_character = 'a';  //type: a char
char *a_char_ptr = &a_character; //memory address, in this case, the one holding a_charachter

通过查看这两个变量的大小,可以最好地看出区别:

 printf("%zu <> %zu\n", sizeof a_character, sizeof a_char_ptr);

上面的代码将为您提供类似 “1 <> 8”“1 <> 4” 的内容,具体取决于您使用的系统。数字表示大小,以字节为单位。

指针也有自己的 printf 格式说明符: %p

 printf("%c is the value stored at %p\n", *a_char_ptr, (void *) a_char_ptr);

要打印实际内存地址(指针的 实际 值),您 需要 将指针转换为泛型 void * 类型。 void 指针是一种通用指针。它是指针,它对它指向的数据不做任何假设。这就是 malloccallocrealloc 返回的通用指针,可以设置为指向任何其他类型。那么 char * 是什么?它是一种通用指针类型,设置为指向 1 字节大小的内存块( sizeof(char) )。从某种意义上说,类型化指针是派生类型,但可以这样想: char *(char *) void *my_ptr; 的缩写

但实际上,什么是类型?它的要点是,类型是确定如何解释内存中数据的方法。 char 类型的变量代表一个字符。 int 类型的变量代表一个整数。同样适用于指针: char *x 不是 char 类型,它是 char * 类型(指向字符的指针)。这意味着 char *x 本身就是内存中的一个位置,我们可以使用它来读取一个或多个 char 值。

我可以咆哮一会儿,但是 TL;TR:

是的,指针是一种数据类型(最纯粹的形式是 void * )。纯形式是完全不可用的(因为你不能取消引用它)。不必每次决定使用指针时都强制转换,C 提供了派生指针类型的便利(如 char *int * 等等)。但实际上,它们是指针,因此本身就是一种数据类型。

原文由 Elias Van Ootegem 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题