我参考了以下链接,
在上面的链接1中,回答中提到了“ Pointers are of pointer type
”。
我只需要知道指针是否是数据类型。
没有人用一个词回答过这个问题。它是数据类型还是不是?
这是我提到的第二个链接说
指针只是一个保存地址的变量,因此人们可能会争辩说指针是一种数据类型,但它没有被定义为一种数据类型(根据“The C Programming Language”。Kernighan & Ritchie)。
原文由 VINOTH ENERGETIC 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,指针是一种数据类型。其中最纯粹的形式(这里主要讲 C)是
void *
。void *
可用于传递内存地址(这就是指针),但不能取消引用。取消引用指针是为了获取指针指向的内存位置中包含的数据,这意味着您知道从内存中读取的数据类型。类型决定了将读取多少内存,因为void
是 “nothing” 。 Avoid *
可以设置为指向可以包含任何类型的任何内存块,因此您可以将void *
转换为任何其他指针类型(int *
,例如),并取消引用它,而不是。我们拥有的每种类型都用于存储特定的数据(值),我们使用
char
存储单个字符,使用int
存储整数,double
存储双精度小数等。除了指针之外,这些类型都不用于在内存中存储位置。因此,就像其他类型一样,指针用于存储特定的数据。所有指针的母亲是void *
。可悲的是,这个
void *
相当受限制:你不能取消引用它,你不能将它用于指针运算(无论如何都不符合标准)。因此,C 为您提供了一系列派生指针类型,让生活更轻松:char *
、int *
、double *
等等。他们是什么,真的,是简写:
(char *) void * my_ptr;
更多尝试使我的观点尽可能清楚:
指针有自己的大小,与它们所指向的类型无关:
通过查看这两个变量的大小,可以最好地看出区别:
上面的代码将为您提供类似 “1 <> 8” 或 “1 <> 4” 的内容,具体取决于您使用的系统。数字表示大小,以字节为单位。
指针也有自己的
printf
格式说明符:%p
:要打印实际内存地址(指针的 实际 值),您 需要 将指针转换为泛型
void *
类型。 void 指针是一种通用指针。它是指针,它对它指向的数据不做任何假设。这就是malloc
,calloc
和realloc
返回的通用指针,可以设置为指向任何其他类型。那么char *
是什么?它是一种通用指针类型,设置为指向 1 字节大小的内存块(sizeof(char)
)。从某种意义上说,类型化指针是派生类型,但可以这样想:char *
是(char *) void *my_ptr;
的缩写但实际上,什么是类型?它的要点是,类型是确定如何解释内存中数据的方法。
char
类型的变量代表一个字符。int
类型的变量代表一个整数。同样适用于指针:char *x
不是char
类型,它是char *
类型(指向字符的指针)。这意味着char *x
本身就是内存中的一个位置,我们可以使用它来读取一个或多个char
值。我可以咆哮一会儿,但是 TL;TR:
是的,指针是一种数据类型(最纯粹的形式是
void *
)。纯形式是完全不可用的(因为你不能取消引用它)。不必每次决定使用指针时都强制转换,C 提供了派生指针类型的便利(如char *
、int *
等等)。但实际上,它们是指针,因此本身就是一种数据类型。