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

时间:2014-11-17 15:50:19

标签: c++ c pointers

我审阅了以下链接,

Link1 Link 2

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

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

没有人用一个字来回答这个问题。它是否是数据类型?

这是我提到的第二个链接

  

指针只是一个保存地址的变量,因此人们可以争辩指针是一种数据类型,但它没有被定义为数据类型(根据“C编程语言”.Kernighan& Ritchie)。

7 个答案:

答案 0 :(得分:15)

是的,指针是一种数据类型。最纯粹的形式(主要是在这里谈论C)是void *void *可以用来传递一个内存地址(这是一个指针),但它不能被解引用。取消引用指针就是为了获取指针所指向的内存位置所包含的数据,这意味着您知道从内存中读取的数据类型。该类型决定了将读取多少内存,因为void "没有" 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);

上面的代码会为您提供类似&#34; 1&lt;&gt;的内容8&#34; &#34; 1&lt;&gt; 4&#34; ,具体取决于您所使用的系统。数字表示大小,以字节为单位。

指针也有自己的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的指针)。这意味着char *x本身就是内存中的一个位置,我们可以用它来读取一个或多个char值。

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

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

答案 1 :(得分:6)

你问了两个不同的问题。

您的标题询问“指针变量的数据类型是什么?”。答案很简单:指针变量属于某种指针类型。例如,给定:

int *ptr;

ptr是一个指针对象,其类型为int*,这是一种指针类型。

问题正文询问“指针是否为数据类型”。通过对“数据类型”这一短语的任何合理定义,指针类型都是数据类型。

C标准从不定义短语“数据类型”,但它在几个地方使用(非正式地)。事实上,标准中的“数据类型”一词的使用都没有引用指针类型,但这并没有告诉我们什么。

标准规定所有类型都是功能类型对象类型。对象类型进一步划分为多个类别:整数类型,数组类型,结构类型,联合类型,指针类型等。指针类型可以是指向对象类型的指针或指向函数类型的指针。 (它可以是指向不完整对象类型的指针;截至2011年标准,不完整类型被归类为对象类型。)

你问题的另一个含糊之处是你使用“指针”这个词。单词“指针”本身通常指的是指针类型的对象,但它也可以引用指针类型的(例如,标准表示{ {1}}返回一个指针)。最好使用“指针”作为形容词而不是名词,所以你可以:

  • 指针类型;
  • 指针对象(指针类型的对象);
  • 指针表达式(产生指针类型结果的表达式);或
  • 指针值(指针类型的值,由指针表达式产生)。

指针类型是对象类型。指针对象是一个对象;标准将对象定义为“执行环境中的数据存储区域,其内容可以表示值”。所以指针对象是数据存储的区域。

Link 2之后,互联网上的一些随机人员写道:“指针只是一个包含地址的变量,因此可以说指针是数据类型,但它没有被定义为数据类型(根据“C编程语言”.Kernighan&amp; Ritchie)“。我不知道K&amp; R是否定义了术语“数据类型”;因为这个人没有提供具体的引用,所以如果不搜索这本书就很难说。但它是定义语言的标准,而不是K&amp; R。

我很好奇:为什么你认为指针类型不会被视为数据类型?

答案 2 :(得分:3)

例如,在C标准中,没有术语数据类型的正式定义。有对象类型和函数类型。同时,指针是从对象和函数类型构造的派生类型。

因此,通常情况下,指针是数据类型,它们是从对象和函数类型构造的数据类型。

C标准中还有术语对象的定义

3.15
1 object
region of data storage in the execution environment, the contents of which can represent
values

因此标准中存在一些矛盾。一方面,指针是对象,因为它们占用内存,内存代表它们的值。所以我们可以说指针是对象类型。另一方面,指针被视为来自对象类型的派生类型。

在我看来,如果在标准中明确写出指针是派生对象类型或派生函数类型会更好。

无论如何,你可能会勇敢地说指针是数据类型!:)

答案 3 :(得分:2)

是的,指针是一种数据类型,指针变量存储指针数据类型

答案 4 :(得分:1)

指针是一种数据类型。所以我们可以创建指针变量,它可以保存内存位置的地址。

答案 5 :(得分:1)

指针类型是数据类型;它们存储指针值。

没有一个单指针类型;指向int的指针与指向char的指针的类型不同,指针与指向double的指针的类型不同,指针与指向10个元素的指针的类型不同int的数组,与指向int的11元素数组的指针的类型不同。

不同的指针类型可能具有不同的大小和表示形式;唯一保证具有相同大小和表示形式的指针类型为void *char *

答案 6 :(得分:0)

与指向数据的数据类型相反,您的问题可能是指“指针的数据类型”,这是人们首先要理解的。

基于此假设,然后请查看类型uintptr_tvoid*

引用Drew Dorman的答案:“ uintptr_t是能够存储指针的无符号整数类型。通常,它与指针的大小相同。”

当然,其大小取决于平台:32位或64位。因此,请勿在不同大小的平台之间传输此变量。

请注意,要进行分配,您必须从“特定”指针类型转换为“通用”指针类型:

int var = 1;
int* addrOfVar = &var; // pointer to variable
uintptr_t pVar = (uintptr_t)&a;
uintptr_t pVar2 = reinterpret_cast<uintptr_t>(&dummy); // alternative cast