什么是C表达开头的*的重要性?

时间:2010-02-10 16:30:40

标签: c pointers

对于知道一点c的人来说,这只是一个简单的问题。在表达的开头是什么意思? 如......

If (this == thisThingOverHere)
ThisThing = *((WORD *) &Array[withThisPosition]);

您可以假设WORD是16位无符号,而Array是8位字节数组。 很难尝试找出这里发生的事情。

干杯

7 个答案:

答案 0 :(得分:8)

找出正在发生的事情并不困难。让我们分解吧。


&Array[withThisPosition]

这表示在Array中使用ThisPosition元素的地址。相当于Array + withThisPosition


(WORD *)

这说假设&Array[withThisPosition]返回的指针实际上是指向WORD的指针。这被称为“强制转换”,因为您告诉编译器将对象与最初的Array类型区别对待。

最后:


*(...)

这表示返回指向的对象。所以返回指向对象内的WORD。

如果我要为你改写这个,我可能会建议:


If (this == thisThingOverHere) {
  void *pointerToArrayELement;
  WORD *pointerToWORD;
  WORD result;

  pointerToArrayElement = &Array[withThisPosition];
  pointerToWORD = (WORD *)pointerToArrayElement;
  result = *pointerToWORD;

  ThisThing = result;
}

答案 1 :(得分:6)

取消引用指针并获取相应的值。

示例:

#include <stdio.h>

int main(int argc, char **argv) { 
     int *i_ptr;
     int i, j;

     i = 5;
     i_ptr = &i;

     j = *i_ptr;

     printf("%d\n", j);
     return 0;
}

打印5

在C中,你有内存位置(想想那种“盒子”),值就在它们里面。每个内存位置都有一个地址,您可以将此地址存储到“指针变量”中,该变量使用类型声明,后跟*。例如,i_ptr是指向整数(int *)的指针,而ij是整数。这意味着在内存中已经分配了三个“框”,其中两个将准备好包含实际数字(ij),并且一个(i_ptr)将准备包含一个地址到另一个框,并通知编译器引用的框将包含一个数字。

使用&,您可以从方框名称中获取该方框的地址:&i为您提供i的地址,您可以将其存储到i_ptr。< / p>

如果您拥有该框的地址,并且想要访问该框并获取该值,则可以使用*,例如*i_ptr为您提供i_ptr中包含的地址框中包含的值。

答案 2 :(得分:2)

this-&gt;值与*(this)相同.value是取消引用指针。

答案 3 :(得分:1)

C具有指针的重要而强大的概念。你应该真正了解它们 - 一个好的教程是available here

如果ptr是指针,则*ptr是指向的值。

答案 4 :(得分:1)

最简单的看一下表达式,然后将它们组合在一起。

&Array[withThisPosition]

这得到了数组withThisPositionArray元素的地址。如果您选择,则可以将其写为:Array+withThisPosition而不是。

(WORD *)

它说要接受它后面的任何内容(上面的位)并将其视为指向WORD的指针。

最初的*,然后说要取消引用该指针 - 即看看它指向的是什么。

总体而言,这是在withThisPosition中找到一个职位(Array),并查看该地址的WORD,并将该字的值分配给ThisThing

答案 5 :(得分:1)

在C中使用*有点令人困惑,因为它有两个不同但相关的含义。你的例子令人困惑,因为这些含义的两个用法都在同一行代码中使用。

当紧邻某个类型时,*是一个修饰符,表示您指的是指向该类型的指针。这在变量声明中最常见,但也可以在强制转换中使用,正如您在此处看到的(WORD *)

当不与类型一起使用时,*是一个取消引用指针的一元运算符。换句话说,它获取操作数的值,将其视为内存位置,并返回该位置的内容。运算符还确定操作数指向的变量类型,并将内存位置的值转换为该类型。编译器通常会进行检查以确保操作数实际上是一个指针。在这种情况下,编译器知道&Array[withThisPosition])是指向一个字节的指针,因为Array是一个字节数组。

回到你的问题,通常当*位于C语句的开头时,它是解引用运算符,但我不保证总是这样。

一旦我将大脑中*的两个含义分开,指针就会减少头痛。

答案 6 :(得分:0)

你的表情中有一些不匹配的parens。我假设你的意思是:

ThisThing = *((WORD *) &Array[withThisPosition]);

(WORD *) &Array[withThisPosition]

部分是指向WORD的类型指针。领先的*指责指针。所以

*((WORD *) &Array[withThisPosition])

是WORD类型。