刚刚进入C++。当我看到乘法符号*
(
例如:
unsigned char * pixels = vidgrabber.getPixels();
这会让其他人失望吗?让我明白这一点的秘诀是什么?
谢谢你。
ps我有另一个相当简单的问题,没有得到回答:(这里:初学者问题:加/减值,而不是只是那个值很漂亮!谢谢你的时间!
刚刚进入C++。当我看到乘法符号*
(
例如:
unsigned char * pixels = vidgrabber.getPixels();
这会让其他人失望吗?让我明白这一点的秘诀是什么?
谢谢你。
ps我有另一个相当简单的问题,没有得到回答:(这里:初学者问题:加/减值,而不是只是那个值很漂亮!谢谢你的时间!
C 和继承 C++ 充满了运算符,并且本质上是上下文敏感的。你将不得不习惯它:
如果*
出现在正在声明(或定义)的变量的名称之前,则它是类型修饰符并使该变量成为指针。
如果它是作为表达式一部分的变量的一元前缀运算符,则它是取消引用(或任何它被重载到的)。
如果它是作为表达式一部分的两个变量的二进制中缀运算符,则它是乘法(或任何它被重载的)。
(从中您可以看到*
in yourunsigned char * pixel
不是取消引用的一元前缀,而是类型修饰符。)
请注意,这&
非常相似*
,只是含义不同:它使变量成为引用,是地址运算符,或二进制 AND。
编写自己的代码时的一项建议是在用作指针/解引用时“拥抱” *:
unsigned char *pixels = ...
if (*pixels == ...)
并在用作乘法时将 * 隔开:
int y = x * 7;
您可以使用其他线索(例如,指针 deref 是一元运算符,而 multiple 是二元运算符)。
答案是:练习。每一种新的编程语言都会在某种程度上看起来很有趣,有些比其他的更有趣。学会使用它,它就会变得自然。
您在 C 中写过关于取消引用的文章。光看就知道结果了吗?==>
int v[] = {5,6}, w[] = {7,8};
int m[][2] = { {1,2}, {3,4} };
int result = * v * * * m * * w;
问候
rbo
您可以通过以下事实来区分解引用运算符和乘法运算符:通常,乘法运算符的左侧没有类型名称。
与其他语言相比,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;”
同样的方式,说英语的人可以绕过这样一个事实,即同一个词可以根据上下文有不同的含义。一旦你有点沉浸在上下文中,操作员在做什么通常会很明显。