"*(指针+整数)"在C++中做什么?

Bea*_*e96 6 c++ pointers

我对这个程序中代码行的作用感到困惑:

int *temp = new int [cap];
int num = 0;

for(int i = name; i < number; i++)
{
 *(temp + count) = *(foo + i);
 num++;
}
Run Code Online (Sandbox Code Playgroud)

name,number和,foo是全局变量(foo作为指针),并且cap是一个参数.

具体来说,我不明白这一行:

 *(temp + count) = *(foo + i);
Run Code Online (Sandbox Code Playgroud)

为什么有指向括号的指针,这会有什么作用?

Kei*_*son 9

*(temp + count) = *(foo + i);
Run Code Online (Sandbox Code Playgroud)

+运营商正在执行指针运算.将一个整数添加到指针值会产生一个新指针,该指针在原始指针之后增加指定数量的对象.例如,如果p是指针arr[0],则p+2指向arr[2].

*运营商deferences结果指针,给你,它指向的对象.

实际上,数组索引操作符[]是根据指针算法定义的,因此A[i]意味着*(A+i)(忽略运算符重载).所以上面的代码行:

*(temp + count) = *(foo + i);
Run Code Online (Sandbox Code Playgroud)

也可以写成(更明确的恕我直言):

temp[count] = foo[i];
Run Code Online (Sandbox Code Playgroud)

您可能需要阅读comp.lang.c常见问题解答,尤其是第4节(指针)和第6节(数组和指针).大多数信息也适用于C++.

但是,C++提供了更高级别的库接口,这些接口可以比低级别的C等价物更强大.编写直接处理数组和指向数组元素的指针的代码在C++中很少是一个好主意,除非它是非常低级的代码和性能是关键的和/或你正在处理来自C代码的数据结构.


vla*_*don 1

*(temp + count) = *(foo + i)方法:

获取temp地址,添加count偏移量,然后将结果地址中的值设置temp + countfoo带有偏移量的地址中的值i

更好的是:

temp[count] = foo[i];
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,它是 C 风格(除了new),而不是 C++。非常糟糕的代码。)

  • 这也不是“C 风格”,只是很糟糕。 (3认同)
  • @Kevin:是的,因为OP还不够混乱。8-)} Bearforce96:由于历史原因,`arr[i]`也可以写成`i[arr]`;`[]` 索引运算符是可交换的。**不要**利用这一事实,除非您进入 [IOCCC](http://ioccc.org/)。 (3认同)
  • temp[ count]= foo[i]; 的写法比较晦涩难懂。 (2认同)
  • @user3164339:如果 `*(count + temp)` 比 `count[temp]` 更高效,那么您需要获得更好的编译器。根据定义,这两个表达式是等效的,任何合适的编译器都应该为两者生成等效的代码。 (2认同)