【问题标题】:How do you easily differentiate the use of * as a pointer, * as a de-reference operator, * as a multiplication operator in C?您如何轻松区分 * 作为指针的使用,* 作为取消引用运算符,* 作为 C 中的乘法运算符?
【发布时间】:2020-06-20 02:43:56
【问题描述】:

* 的使用非常令人困惑,尤其是对于我们 C 的新手来说。我的意思是,您如何轻松区分使用 * 作为指针,* 作为取消引用运算符,@ 987654324@作为乘法运算符?我在网上看到很多* 的不同用法,这很令人困惑,尤其是关于* 的不同位置,例如如下面的示例代码所示。 * 的哪些位置是正确且可取的,以避免与指针、取消引用和乘法混淆? 代码只是示例,可能...实际上无法编译。

int main(void){
  int *size, length, width;
  *size1= malloc(sizeof(int) * length);
  *size2= (int *) malloc(width * sizeof(int) * width);
  *size3= malloc(sizeof(int) *length);
  printf("%d\n%d\n%d\n", size1,size2,size3);
  return (0);
}

注意:我是 C 的新手,请不要向我推荐无用的链接和(“据说”)重复的,它们不能回答与此完全相同的问题......请允许其他人发表他们的观点,所以我们得到最多的答案,没有人知道这一切,你会惊讶于会弹出一些新的东西,即使对于所谓的 C 老前辈也是如此。

【问题讨论】:

  • 那是相当冒犯的态度。如果您的问题是重复的,那么不仅应该向您推荐其他答案,而且应该关闭您的问题。

标签: malloc dynamic-memory-allocation realloc calloc


【解决方案1】:

当你阅读 C 代码时,你必须能够区分定义和表达式。定义以可选的类型开头,前面是存储类,例如externstatictypedef... 和/或类型限定符,例如constvolatile。正在定义的标识符前面的星号表示该变量是一个指针,多个星号表示多级间接。

在表达式中,星号可以作为二元运算符出现在操作数之间,也可以作为一元运算符出现在其操作数之前。二元运算符* 是乘法运算符,而一元运算符* 是解引用运算符。

根据经验,标识符或后缀运算符后面的* 是乘法运算符。后缀运算符为++--,使用[] 进行索引,并在() 中调用带有可选参数的函数。

混淆来自于C语言的简洁性,它允许程序员随意组合这些不同的用途:

 int x=0,*p=&x,n=*p**p;

这条丑陋的线确实令人困惑。我们先插入有意义的空格来提高可读性:

 int x = 0, *p = &x, n = *p * *p;

C 编译器大多不需要空格,但遵循简单的规则可以提高人类的可读性:

  • 在二元运算符两边添加一个空格
  • ,; 之后添加一个空格,行尾除外
  • 不要在一元运算符及其操作数之间插入空格,sizeof 除外。
  • 以一致的方式缩进代码,通常每级 4 个空格

上面这行代码定义了3个变量xpn。 * p 是指向 int 的指针,而 xnint 变量。 * x 初始化为 0 * p被初始化为x的地址。 * n 的初始值设定项是 p 所指向的值与自身相乘的结果。

在同一个定义中定义具有不同间接级别的多个变量是不受欢迎的,因为它令人困惑且容易出错。强烈建议将上述定义重写为 3 行:

 int x = 0;
 int *p = &x;
 int n = *p * *p;

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2012-04-02
    • 2014-01-12
    相关资源
    最近更新 更多