C中的指针:数据类型或操作

时间:2015-09-18 05:43:59

标签: c pointers

我们会在C中调用指针数据类型(类型为void *),还是仅对无符号整数执行操作,使其值被解释为虚拟内存地址?如果是数据类型,哪些硬件和软件因素会影响其范围?

6 个答案:

答案 0 :(得分:2)

我认为你将两个东西混合在一起 - 间接运算符和指针变量。

间接运算符(*) - 间接运算符是一元运算符,可用于获取存储在指针变量引用的内存位置的值。

指针变量 - 在C指针中是存储地址的特定类型的变量(例如int,char,void),可以为null。

指针的大小取决于不同的因素。你可以转到下面的链接。他们解释得很好。

What is the size of a pointer? What exactly does it depend on?

答案 1 :(得分:1)

C认为你的整个计算机是一个庞大的字节数组。显然这不是非常有用,但是在这个庞大的字节数组之上的C层是这些类型的类型和大小的概念。

  • 在计算机内创建一块内存。

  • "指向"该块开头的名称ptr()。

这间接意味着它需要一个类型说明符,它与它指向的数据类型相同。

答案 2 :(得分:1)

是的,他们是数据类型。与void *一样。

intptr_t整数可以存储除函数指针之外的任何指针。因此,您可以将这些指向数据对象的指针视为特殊整数。 (但请记住整数和指针是不同的类型。)

您的编译器为您的目标环境生成代码。例如。如果使用选项-m32进行编译,则指针大小可能为32位。它可以在32位架构上运行,其中CPU寄存器可以存储32位存储器地址。虽然64位体系结构可能仍然支持32位应用程序,但您可以使用选项-m64进行编译,以便从更大的指针(可能是64位)中受益。

答案 3 :(得分:1)

你问的很多想法。我将尝试尽可能地引用C standard给出正式的想法,然后将其分解为易于理解的东西。

我们会在C中调用指针数据类型(类型为void *),还是仅对无符号整数执行操作,使其值被解释为虚拟内存地址?

来自C标准:

  

6.2.5类型

     
      
  1. 指针类型可以从函数类型,对象类型或不完整类型派生,称为引用类型。指针类型描述一个对象,其值提供对引用类型的实体的引用。从引用类型 T 派生的指针类型有时称为“指向 T ”的指针。从引用类型构造指针类型称为“指针类型派生”。
  2.         

    6.3.2.3指针

         
        
    1. 整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。
    2.   
    3. 任何指针类型都可以转换为整数类型。除了之前指定的以外,结果是实现定义的。如果结果无法以整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。
    4.   

指针不是数据类型(至少在传统意义上的短语)或整数 - 它是C程序员表示某个对象位置的方式。虽然我们倾向于将其视为一个数字 - 即0xf000b3a8 - 但 没有理由成为一个数字。它只需要标记特定对象的位置。此外,它指向的对象的类型决定了它自己的指针类型。因此,类型为“float *”的指针等同于“指向float的指针”。 float类型 - 它是指针类型。

举一个具体的例子,想想你如何整理你的卧室 - 也许你有一张床,一张桌子,一套抽屉,一个衣柜和一个床头柜。在你上床睡觉之前,你拿出一张便条并写上“记住桌上的耳机”。然后你把那个便利贴放在你的背包上。粘滞便笺是耳机的指针!它提醒您这些耳机所在的位置 - 您的桌子,不是数字。

我们倾向于将指针视为整数的原因来自6.3.2.3.5和6.3.2.3.6节。计算机 - 正如他们目前设计的那样 - 不理解“桌子”或“壁橱”的概念。他们只了解数字 - 所以我们相应地组织它们。因此,C标准规定整数必须能够转换为指针,反之亦然。

如果是数据类型,哪些硬件和软件因素会影响其范围?

同样,指针实际上并不是一种数据类型 - 它表示某个对象的位置(该对象又具有指示指针类型的特定类型)。因此,我们无法真正谈论指针的范围本身。我们可以谈论的是可能的内存地址范围(以及指针指向的可能位置的范围!)。

当天,当恐龙在地球上漫游而尼克松在办公室时(我还是个年轻人,我能说什么),英特尔推出了英特尔8008微处理器 1 < / SUP>。这只小狗是世界上第一个 8位 CPU - 也就是说,它可以对8位值执行数学运算。假设2的补码表示法,这允许无符号值0到2 8 -1(0到255)和符号值-2 7 到2 7 -1(-128到127)。此外,它有一个外部14位地址总线,可以处理高达16KB的内存。这相当于2个 14 (16384)个存储单元,每个存储单元包含8位。因此,整个范围是从字节0到字节16383。

快进到今天。大多数现代台式机和笔记本电脑都运行在64位处理器上。这些支持(理论上)2 64 字节的内存 - 高达18,446,744,073,709,551,616个位置。这相当于大约16艾字节 - 其中一个艾字节是1,000,000太字节。 (It's speculated that Google stores approximately this much data in their datacenters)。但是,目前大多数架构只使用较低的48位 2

这些代表C中指针理论上指向的物理位置的总数。实际上,由于虚拟内存的工作原理,您作为程序员将会看到的范围更加有限。不过,这是另一天的故事。

答案 4 :(得分:0)

指针是一个变量,其值是另一个变量的地址。一般来说,C中的指针可以指向虚拟内存中的任何地址,并且为NULL。

答案 5 :(得分:-2)

指针通常是一个变量,其值是另一个变量的地址,例如, 内存位置的直接地址。与任何变量或常量一样,必须先声明指针,然后才能使用它来存储任何变量地址。

所有指针的值的实际数据类型,无论是整数,浮点数,字符还是其他,都是相同的,是表示内存地址的长十六进制数。

例如:int *ip; /* pointer to an integer */

指针值的运行时表示通常是原始内存地址(可能由字内偏移字段增强),但由于指针的类型包含类型指出的事情,包括指针的表达式可以在编译时进行类型检查。指针算术会根据指向数据类型的大小自动缩放。

AS for void指针(void *)指向未指定类型的对象,因此可以用作&#34; generic&#34;数据指针。由于指向对象的大小和类型是未知的,因此无法取消引用void指针,也不允许使用指针算术,尽管它们很容易(并且在许多上下文中隐式地)转换为任何其他对象指针类型。

See wiki