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* pixels
或char *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 ++初学者问题:取消引用与乘法[重复]的主要内容,如果未能解决你的问题,请参考以下文章