【问题标题】:*Pointer = - *Pointer?*指针 = - *指针?
【发布时间】:2014-10-31 08:19:48
【问题描述】:

我只做了几个星期的 C,所以我对它很陌生。

我见过类似的东西

* (variable-name) = -* (variable-name) 

在讲义中,但它到底能做什么?它会否定所指向的值吗?

【问题讨论】:

  • 是的,会的。 (所以,这不完全是pointer = -pointer,而是pointed_object = -pointed_object。)
  • 认为它会很简单,并注意到。感谢您的快速回复!
  • 注意*ptr *= -1; 更短。
  • @wildplasser 通常但如果变量名是单个字母则不是:*i = -*i;(7 个符号)....*i *= -1;(7 个符号)。我认为你应该调整你的评论。
  • 呃!我的意思是:更容易阅读。人脑只需要查找一个标识符,不需要检查 LHS 和 RHS 是否相等。恕我直言,-1 常量非常常见,无需查找即可识别...

标签: c pointers


【解决方案1】:

是的。当您添加星号时,这意味着它指向该值。 它本质上是说:将地址(变量名)处的值变成-1*(变量名)的值。

如果您是 C 新手,您可能会发现使用 & 代替指针更容易。 & 本质上是 * 的反义词。 & 没有指向,它给出了变量的地址(我发现这是一个更简单的概念)。

以下是一个示例,应该演示*& 的使用。

#include <stdio.h>

int main(void)
{
    int blah = 6;
    int *num = &blah;
    (*num) = -(*num);
    printf("%d\n", num); //Displays num
}

【讨论】:

  • 这不是 C,我的朋友。
  • 我用的是C++,很相似,但说明了这一点。
  • 不,它们是两种不同的语言。
  • @ZacWimer 语言不同,OP 可能不熟悉 C++-ism。
  • 它们是,但是 C++ 是从 C 中诞生的。这两个函数在 C 和 C++ 中都存在。结构是相同的,所以它证明了我试图提出的观点。
【解决方案2】:

是的,它否定了指向的值。我们不能在地址上写操作,所以操作是在引用的指针上完成的。这里,*d = -*c 的意思是:

*d = (-1) * (*c)

示例代码:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int *c;
    int *d;
    d = (int *)malloc(sizeof(int));
    c = (int *)malloc(sizeof(int));
    *c = 9;
    *d = -*c;
    printf("%d", *d);
    free(c);
    free(d);
    return 0;
}

【讨论】:

  • 请添加一些空格。 (注:在K&R2之前*d=-*c;有不同的含义)
  • @wildplasser:如果您正在考虑旧式赋值运算符=- 而不是-=,那么即使K&R 1 也使用了新版本。见What does =+ mean in C?
  • 您说我们不能对地址进行操作,但这并不完全准确。你可以从一个地址中加或减一个整数,或者取两个地址的差(对同一个数组中的两个对象),但你不能乘或除地址,也不能取反。
  • @JonathanLeffler [是] IIRC(至少)仍然被编译器接受,通常带有警告。不过,对 K&R1 不太确定。
  • @wildplasser:我相信你的编译器必须早于 1980 年才能接受 =- 作为现代的 -=。在 1979 年 AT&T 第 7 版 UNIX 和 K&R 第 1 版发布之前,旧的符号已被淘汰。我没有仔细检查第 6 版 UNIX 的 Lyons 分析;发现其中使用了旧符号,我不会感到很惊讶。
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2021-08-14
相关资源
最近更新 更多