c++ - C++中使用指针的数组中元素的数量

标签 c++ arrays pointers

因此,在备考期间,我尝试做一个指针练习题。

在下面的代码中,我试图显示第一次出现 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,直到它指向一个值为 0int。如果用户输入任何零值,第二个循环将在找到第一个时停止(即使用户在此之后输入非零元素)。如果用户没有输入等于 0 的值,则 while 循环具有未定义的行为,因为 Aptr 将继续遍历内存直到结束A 直到碰巧找到比较(作为 int)等于 0 的内存。

关于c++ - C++中使用指针的数组中元素的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41178002/

相关文章:

c++ - 类型错误引用的无效初始化

c++ - 使用递归编程的树

C# 初学者 : If an item from a array was found in a string

c - 仅为数组的一个元素分配内存

c++ - 标准容器作为多线程应用程序中的局部变量

c++ - 在 boost-build (b2) 项目中构建基于 makefile 的依赖项

Python:将 CSV 数据存储在列表或数组中

arrays - 访问(传统)记录的字段

c - 你如何在 C 中传递结构指针?

c - 如何将一个结构指向另一个