C ++初学者问题:dereference vs multiply

时间:2010-08-18 18:12:05

标签: c++ pointers reference dereference

刚进入C ++。当我看到用于表示变量的解除引用的乘法(*)的符号时,我不断偏离轨道

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

这会让其他人失望吗?让我了解这个问题的秘诀是什么?

谢谢。


P.S。我有另一个相当简单的问题,但没有得到答案:(这里:beginner question: add/subtract to value rather than just be that value非常高兴!谢谢你的时间!

7 个答案:

答案 0 :(得分:18)

C和继承C ++被运算符淹没,并且本质上是上下文敏感的。你必须习惯它:

如果*在声明 (或定义)的变量名称之前出现 ,则它是 类型修饰符< / em> 并使该变量成为指针 如果对于作为表达式一部分的变量,它是 一元前缀运算符 ,则 解除引用 (或其他它被超载了。) 如果对于作为表达式一部分的两个变量,它是 二进制中缀运算符 ,则它是 乘法 (或者其他它被超载了)。

(从此可以看出,*中的unsigned char * pixel不是解除引用的一元前缀,而是类型修饰符。)

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

答案 1 :(得分:8)

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

unsigned char *pixels = ...

if (*pixels == ...)

并在用作乘法时间隔*:

int y = x * 7;

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可以通过乘法运算符左侧没有类型名称来区分解除引用运算符和乘法运算符。

答案 4 :(得分:1)

Contrived Example

您在C 中撰写了关于解除引用的文章。 你能看到它的结果吗? ==&GT;

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

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

此致

RBO

答案 5 :(得分:1)

英语发音者以同样的方式解释同一个词根据上下文可能有不同的含义。一旦你沉浸在上下文中,通常很明显操作员正在做什么。

答案 6 :(得分:1)

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

int* foo,bar;

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

int *foo;
int *ptr1,*ptr2,*ptr3;
int bar,boz,baz;

同样重要的是要注意像'const'和'volatile'这样的存储类限定符可能并不总是像预期的那样绑定。该声明

volatile int *foo;
并不意味着'foo'是一个不稳定的,而是'foo'指向的是一个不稳定的。如果foo本身是'易变'的东西,那么必须写“int * volatile foo;”