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

时间:2015-11-11 21:42:28

标签: c++ pointers

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

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

for(int i = name; i < number; i++)
{
 *(temp + count) = *(foo + i);
 num++;
}

namenumberfoo是全局变量(foo是指针), 而cap是一个论点。

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

 *(temp + count) = *(foo + i);

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

4 个答案:

答案 0 :(得分:9)

*(temp + count) = *(foo + i);

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

*运算符 deferences 生成的指针,为您提供指向的对象。

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

*(temp + count) = *(foo + i);

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

temp[count] = foo[i];

您可能需要阅读comp.lang.c FAQ,特别是第4节(指针)和第6节(数组和指针)。大多数信息也适用于C ++。

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

答案 1 :(得分:2)

在你的例子中

*(temp + count) = *(foo + i);

相当于

temp[count] = foo[i];

表达式*(temp + count)将整数count添加到指针temp,它为您提供指向count指向的数组中temp位置元素的指针和dereferences它。

答案 2 :(得分:1)

*(temp + count) = *(foo + i)表示:

获取temp地址,向其添加count偏移量,然后将结果地址temp + count中的值设置为地址foo的值,偏移量为i < / p>

更好的将是:

temp[count] = foo[i];

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

答案 3 :(得分:0)

也许你问题的关键是:

  

为什么有括号[...]的指针?

C和C ++中的int* int_ptr符号在语义上有些混乱。你是正确的,它有时意味着&#34;指向,&#34;与*中一样,int_ptr表示&#34; *指向 (temp + count)&#左侧类型的指针34。

但它意味着&#34;取消引用指向......&#34;的指针,这就是这里实际发生的事情。表达式(foo + i)int计算指针指向* s,因为向指针值添加类似int的类型会导致指针值 offset 通过整数类型(即,您正在计算距离原始指针一定距离的内存地址)。括号只是确保在应用*(temp + count)之前进行加法运算。因此temp + count 解除引用指针值temp + count。这意味着它将计算为存储在地址int* int_ptr的整数值。

您可以通过考虑第一个含义来消除一些混淆,因为表示取消引用:int *int_ptr等同于int_ptr,即&#34; if如果您取消引用int,则会获得int* int_one, int_two。&#34;这直观地说明了为什么int_oneint声明为指向 int_two的指针,以及int作为{{1}}的指针 - - 作为指针类型。