C ++初学者问题:取消引用与乘法[重复]

Posted

技术标签:

【中文标题】C ++初学者问题:取消引用与乘法[重复]【英文标题】:C++ beginner question: dereference vs multiply [duplicate] 【发布时间】:2011-03-31 17:20:25 【问题描述】:

刚接触 C++。当我看到乘法符号 (*) 被用来表示一个变量的取消引用时,我经常偏离轨道

例如: unsigned char * pixels = vidgrabber.getPixels();

这会让其他人失望吗?让我明白这一点的秘诀是什么?

谢谢。


附言我还有一个相当简单的问题,但没有得到回答:(这里:beginner question: add/subtract to value rather than just be that value 非常感谢!感谢您的宝贵时间!

【问题讨论】:

您的示例不是取消引用 - 它只是变量 pixels 类型的一部分。但我知道你的意思。 你问让我明白这个问题的秘诀是什么?(意思是:这里的C指针表示法)-我会说:习惯它。人们如何在现代实验室中制造生物武器?同样的事情。 采用一致的风格是关键。例如,切勿在 * 的两侧使用空格,除非您将其用作乘法运算符。不要选择char * pixels,而是选择char* pixelschar *pixels 我发现将 C 指针符号与生物武器的生产进行比较很有趣。但是,是的,这里其他人所说的都是正确的。花时间学习这门语言会让你更熟悉它的语法。 @Eric,这并不是一个真正的比较(但可能看起来像一个) - 它是对人们每天做的一类疯狂事情的​​看法,因为他们认为他们别无选择。这就是哲学术语中的“异化”。 (顺便说一句。我是一名 C 程序员(后来的 C++)大约 20 年了) 【参考方案1】:

C 和继承的 C++ 都充斥着运算符,并且本质上是上下文相关的。你将不得不习惯它:

如果* 出现在正在声明的变量的名称之前(或定义),则它是一个类型修饰符 并使该变量成为指针。 如果它是作为表达式一部分的变量的 一元前缀运算符,则它是 dereferencing(或其他任何它已被重载到)。 如果它是作为表达式一部分的两个变量的 二元中缀运算符,则它是 乘法(或其他它已被重载到)。

(由此您可以看到unsigned char * pixel 中的* 不是取消引用的一元前缀,而是类型修饰符。)

注意&* 非常相似,只是含义不同:它使变量成为引用,是地址运算符,或二进制AND。

【讨论】:

+1 可以很好地回答这个问题的概括以及这个问题本身。我特别喜欢“上下文相关” +1 用于详细解释 * 的不同用法。更详细地解释一下 & 和 * 之间的区别如何? @Arun:我不确定你在期待什么。【参考方案2】:

编写自己的代码时的一个建议是在用作指针/解引用时“拥抱” *:

unsigned char *pixels = ...

if (*pixels == ...)

并在用作乘法时将 * 隔开:

int y = x * 7;

您还可以使用其他线索(例如,指针 deref 是一元运算符,而 multiple 是二元运算符)。

【讨论】:

【参考方案3】:

答案是:练习。每一种新的编程语言都会在某种程度上看起来很有趣,有些比其他的更有趣。学会使用它,它就会变得自然。

【讨论】:

【参考方案4】:

您可以通过以下事实来区分解引用运算符和乘法运算符:通常,乘法运算符的左侧没有类型名称。

【讨论】:

【参考方案5】:

人为的例子

您写过关于C 中的解引用。 光看就知道结果了吗? ==>

int v[] = 5,6, w[] = 7,8;
int m[][2] =  1,2, 3,4 ;

int result = * v * * * m * * w;

问候

rbo

【讨论】:

* v * * * m * * w的意思是猫又在键盘上了。 (它在争夺注意力时经常这样做。) 很好的答案!对指针不熟悉的初学者肯定会从中受益。 在我的脑海中,我认为“* * m”会产生一些奇怪的东西.. *m 是 1,但 **m 内存地址 0x00000001 的内容可能是某些内容平台。无论如何,不​​管是什么,结果都是 35 倍。 变量后面总是只能有一个乘数,其他的都是解引用。因此,只需按照建议保持对变量的取消引用关闭(= 没有空格),因此它更改为 int result = *v * **m * *w 并且解决方案非常简单。 @Sparr:我想,该死的你是对的(因此我的回答错了),但反汇编证明你错了。【参考方案6】:

说英语的人绕过这样一个事实的方式相同,即同一个词可以根据上下文具有不同的含义。一旦您稍微沉浸在上下文中,操作员在做什么通常会很明显。

【讨论】:

【参考方案7】:

与其他语言相比,C 语言需要注意的重要一点是,当多个声明组合在一个语句中时,星号适用于单个项目,而不是整个集合。例如:

int* foo,bar;

创建一个名为 foo 的 int 指针和一个名为 bar 的 int。我总是将星号与变量挂钩,因此我避免在一个语句中混合指针和非指针:

诠释*富; 整数 *ptr1,*ptr2,*ptr3; int bar,boz,baz;

还需要注意的是,像“const”和“volatile”这样的存储类限定符可能并不总是像预期的那样绑定。该声明

易变的int *foo; 并不意味着'foo'是一个volatile,而是'foo'指向的是一个volatile。如果 foo 本身是“易失性”事物,则必须写为“int * volatile foo;”

【讨论】:

以上是关于C ++初学者问题:取消引用与乘法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c数组指针的约瑟夫杯问题 初学者求助

c语言的矩阵乘法问题 初学者求助

C中关于Memset的简单问题[重复]

Java - 方法调用后对象状态不会改变[重复]

C# 还是 C++?这是一个问题[重复]

浅谈学习C语言与学习C++语言的关系