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,calloc并realloc返回,通用指针,可以设置在任何其他类型的指向.那是什么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 *等等).但实际上,它们是指针,因此它们本身就是一种数据类型.
你问了两个不同的问题.
您的标题询问"指针变量的数据类型是什么?".答案很简单:指针变量属于某种指针类型.例如,给定:
int *ptr;
Run Code Online (Sandbox Code Playgroud)
ptr是一个指针对象,它的类型是int*指针类型.
您的问题正文询问"指针是否是数据类型".通过短语"数据类型"的任何合理定义,指针类型是数据类型.
C标准从未定义短语"数据类型",但它确实在几个地方使用它(非正式地).事实上,标准中的"数据类型"一词的使用都没有引用指针类型,但这并没有告诉我们什么.
标准说所有类型都是函数类型或对象类型.对象类型进一步划分为多个类别:整数类型,数组类型,结构类型,联合类型,指针类型等.指针类型可以是指向对象类型的指针或指向函数类型的指针.(它可以是指向不完整对象类型的指针;截至2011年标准,不完整类型被归类为对象类型.)
你的问题的另一个含糊之处是你使用"指针"这个词.单词"指针"本身通常指的是指针类型的对象,但它也可以引用指针类型的值(例如,标准表示malloc返回指针).最好使用"指针"作为形容词而不是名词,所以你可以:
指针类型是对象类型.指针对象是一个对象; 标准将对象定义为"执行环境中的数据存储区域,其内容可以表示值".因此指针对象是数据存储的区域.
在你的链接2之后,互联网上的一些随机人员写道:"指针只是一个包含地址的变量,所以有人可能会争辩说指针是一种数据类型,但它没有被定义为数据类型(根据"C编程)语言".Kernighan&Ritchie)".我不知道K&R是否定义了"数据类型"一词; 因为这个人没有提供具体的引用,所以如果不搜索这本书就很难说.但这是定义语言的标准,而不是K&R.
我很好奇:为什么你认为指针类型不会被视为数据类型?