因此,在备考期间,我尝试做一个指针练习题。
在下面的代码中,我试图显示第一次出现 0 之前的元素数。
只有一处我没看懂请看倒数第六行。
#include <iostream>
using namespace std;
int main()
{
int A[10];
for (int i = 0; i < 10; i++){
cout << "Please enter number " << i + 1 << " in the array: ";
cin >> A[i];
}
int *Aptr = A;
while(*Aptr !=0){
cout << *Aptr << "";
Aptr++;
}
cout << "\nThere are " << (Aptr - A) //Here is what i don't understand.
<< " numbers before the first occurrence of 0." << endl;
system("pause");
return 0;
}
那么为什么 (Aptr - A) 给我元素的数量而不是内存位置,为什么这甚至是可行的,因为 Aptr 是一个指针并且A 是数组?
有人可以详细解释一下吗?
最佳答案
在表达式中使用时,如Aptr - A
,数组A
的名称将被隐式转换为指针(等于&A[0 ]
).
然后编译器面临减去两个相同类型的指针(在您的情况下都是 int *
类型)。这被指定为提供 std::ptrdiff_t
类型的值,这又是“能够表示减去两个指针的结果的带符号整数类型”。
指针运算,当两个int
类型的指针相减时(即两个int *
)给出两者之间int
的个数指针(假设它们在同一个对象中,在这种情况下是正确的,因为 Aptr
指向数组 A
的一个元素)。
实际上,如果 Aptr
等于 &A[i]
,则减法 Aptr - &A[0]
给出 std::ptrdiff_t
等于 i
。
注意:您的代码中还有另一个问题,因为第一个 (for
) 循环读取 10
值,而第二个 while
循环不断递增 Aptr
,直到它指向一个值为 0
的 int
。如果用户输入任何零值,第二个循环将在找到第一个时停止(即使用户在此之后输入非零元素)。如果用户没有输入等于 0
的值,则 while
循环具有未定义的行为,因为 Aptr
将继续遍历内存直到结束A
直到碰巧找到比较(作为 int
)等于 0
的内存。
关于c++ - C++中使用指针的数组中元素的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41178002/