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

VIN*_*TIC 8 c c++ pointers

我审阅了以下链接,

Link1 Link 2

在上面的link1中,在答案中提到了" Pointers are of pointer type".

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

没有人用一个单词回答这个问题.是数据类型还是没有?

这是我提到的第二个链接

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

Eli*_*gem 16

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

我们拥有的每种类型都用于存储特定的数据(值),我们使用a 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
Run Code Online (Sandbox Code Playgroud)

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

printf("%zu <> %zu\n", sizeof a_character, sizeof a_char_ptr);
Run Code Online (Sandbox Code Playgroud)

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

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

printf("%c is the value stored at %p\n", *a_char_ptr, (void *) a_char_ptr);
Run Code Online (Sandbox Code Playgroud)

要打印实际的内存地址(指针的实际值),您需要将指针强制转换为泛型void *类型.void指针是通用指针的一种; 它是指针,它不会对它所指向的数据做出任何假设.这是什么malloc,callocrealloc返回,通用指针,可以设置在任何其他类型的指向.那是什么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 *等等).但实际上,它们是指针,因此它们本身就是一种数据类型.


Kei*_*son 6

你问了两个不同的问题.

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

int *ptr;
Run Code Online (Sandbox Code Playgroud)

ptr是一个指针对象,它的类型是int*指针类型.

您的问题正文询问"指针是否是数据类型".通过短语"数据类型"的任何合理定义,指针类型是数据类型.

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

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

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

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

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

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

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


hac*_*cks 2

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