【问题标题】:size of array of integer pointers整数指针数组的大小
【发布时间】:2017-07-08 20:27:32
【问题描述】:
#include<stdio.h>
#include<conio.h>

void main()
{
  int a[5]={1,2,3,4,5};
  int (*p)[5];
  int *p1[5];
  clrscr();

  printf("%d\n",(int)sizeof(a)); // 10
  printf("%d\n",(int)sizeof(p));  //2
  printf("%d\n",(int)sizeof(p1)); //10
  getch();
}

第一个输出是 10,因为每个整数都是 2 个字节,因此 5 个整数需要 10 个字节。

我无法理解第三个输出,即 10。这里我们有一个指针数组,每个指针都指向一个整数。我系统中指针(或地址)的大小为 32 位(4 字节)。所以输出应该是 5*4=20,因为我们有 5 个指针,每个指针 4 个字节?

【问题讨论】:

  • 这是 C 还是 C++?您是否有机会使用 Turbo C++?
  • 你的系统可能是 32 位的,但 TurboC++ 是在 16 位编译器风靡一时之前出现的。
  • @WeatherVane:OP 声明他使用的是 TurboC++。在进一步的信息之前,它更可能是 C++(即 TC++ 的古老方言)而不是 C。
  • 停止使用它,让自己成为上个千年所没有的编译器。
  • @Xylene23 这是一个新问题。提出新问题以提出新问题。更好的是,不要问它。这应该在任何不是完全欺诈的教科书的前几章中介绍。

标签: c++ arrays pointers


【解决方案1】:

第二个打印输出显示您机器上的指针大小为 2 个字节。
数组 int *p1[5]; 有 5 个元素,而不是 10 个。

5 * 2 = 10。

【讨论】:

  • 立即查看我的编辑。指针的大小取决于系统对吗?在我的情况下,它是 32 位,所以 4 个字节。那么对于一个包含5个指针的数组,数组的大小不应该是5*4=20吗?
  • 第二个printf 将打印4 如果这是真的。
  • 在指针数组中,增量大小是多少?它是根据它指向的类型(在这种情况下为int)还是根据指针的大小(16位或2字节)?
  • 它将是sizeof(int *)
  • 它所说的只是一个指针占用两个字节。不过,这并没有说明字节的宽度。
【解决方案2】:

我系统中指针(或地址)的大小是 32 位

Turbo C++ 是一个 MS-DOS 程序。它无法直接在现代操作系统上运行。你的操作系统以一种对你完全透明的方式创建了一个模拟的 16 位 MS-DOS 机器来运行你过时的东西。所以不,您的(模拟)系统上的指针大小是 16 位。您使用的是 16 位系统。

如果您将代码生成切换到“大型”或“巨大”模式,Turbo C++ 实际上能够使用 32 位指针。该系统仍然是一个 16 位的系统,它只是有一个带有“长”指针的奇怪寻址方案。

顺便说一句,在当前千禧年使用 Turbo C++ 是not recommended(警告:无耻插件)。

【讨论】:

    【解决方案3】:

    您使用的是 16 位系统

    所有三个数字都相互一致。但是您似乎使用的是 16 位系统。所以你的指针使用 2 个字节。 5 个元素乘以 2 个字节,每个元素总共等于 10 个字节。

    【讨论】:

    • 我没有使用 16 位系统,但 Turbo C++ 仍然显示它是 16 位的。我不知道这背后的原因。
    • @Xylene23 可能是您的系统可以在硬件中处理 32 位数字。但是您的指针使用 2 字节(即 16 位)。所以我认为它被称为16位系统(实际上是按定义)。
    • @Xylene23 Turbo C++ 用于编译可在 16 位操作系统上运行的程序。它不知道存在除 16 位寻址之外的任何内容。您的更先进的计算机和操作系统已经足够友好地从您使用 Turbo C++ 编译的程序中隐藏其他 16 位的存在并允许它们运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多