我对这个程序中代码行的作用感到困惑:
int *temp = new int [cap];
int num = 0;
for(int i = name; i < number; i++)
{
*(temp + count) = *(foo + i);
num++;
}
name
,number
和foo
是全局变量(foo
是指针),
而cap
是一个论点。
具体来说,我不明白这一行:
*(temp + count) = *(foo + i);
为什么有指向括号的指针,这会做什么?
答案 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_one
将int
声明为指向 int_two
的指针,以及int
作为{{1}}的指针 - - 不作为指针类型。