【问题标题】:C++: If size of pointer int is only 4 how can it accommodate an array?C++:如果指针 int 的大小只有 4,它怎么能容纳一个数组?
【发布时间】:2015-07-06 09:28:38
【问题描述】:

看看这个程序。 ptr 如何获取数组中的所有内容?我有点困惑。

  #include <stdio.h>
    int main()
    {
       int arr[] = {10, 20, 30, 40, 50, 60};
       int *ptr = arr;

       // sizof(int) * (number of element in arr[]) is printed
       printf("Size of arr[] %d\n", sizeof(arr));

       // sizeof a pointer is printed which is same for all type 
       // of pointers (char *, void *, etc)
       printf("Size of ptr %d", sizeof(ptr));
       return 0;

}

【问题讨论】:

    标签: c++


    【解决方案1】:

    在此声明中

    int *ptr = arr;
    

    指针ptr由数组arr的第一个元素的地址初始化。

    ptr[i] 这样的表达式被编译器考虑,如*(ptr + i),其中ptr + i 产生一个指向数组arr 的第i 个元素的指针

    这导致你甚至可以写成i[ptr] 而不是ptr[i],因为在这两个表达式中都使用了相同的指针算法。

    试一试

    std::cout << 6["Hello CMan"] << std::endl;
    

    std::cout << &6["Hello CMan"] << std::endl;
    

    所以使用指向数组arr的第一个元素的指针ptr和所谓的指针算法可以访问数组arr的任何元素。

    指针不容纳数组。指针和数组占用不同的内存区域。但是指针存储的是数组第一个元素的地址。

    【讨论】:

      【解决方案2】:

      ptr 将“引用”数组的第一个元素。

      每个其他元素将通过“添加”到基指针地址值来访问,元素的大小乘以索引

      【讨论】:

        【解决方案3】:

        指针只是一个数字,表示数组开头的内存地址。它不包含有关数组本身的任何信息,因此它指向的数组的大小没有限制。

        【讨论】:

          【解决方案4】:

          ptr 的类型是int*,因此 sizeof 返回用于在内存中存储指针的字节数。它不返回数组的大小。

          【讨论】:

            【解决方案5】:

            您可以在以下链接中找到此问题的答案(并且可能不止于此):

            Are a, &a, *a, a[0], &a[0] and &a[0][0] identical pointers?

            How to find the 'sizeof' (a pointer pointing to an array)?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-21
              • 2017-06-01
              • 1970-01-01
              • 2018-09-14
              • 2016-11-11
              • 2015-04-28
              • 1970-01-01
              相关资源
              最近更新 更多