【问题标题】:Which data type does pointer points to?指针指向哪种数据类型?
【发布时间】:2017-08-10 06:11:22
【问题描述】:

我对指针有点困惑。

如果我有这个,请说:

int size;
int bytes;
int numbers;
int *ptr;

ptr = new int[500];

我的问题是指针首先指向任何特定变量或仅指向整体 int 变量。如果我想要一个指针只指向数字变量怎么办。

如果你不介意,我有一个尾巴问题。我正在尝试为我的数组分配动态内存,这有效吗? :

int numbers[20];
int *ptr;
ptr = new int[size];

这会给我的数组一个堆内存吗?

我正在处理一个非常大的数组,如果不使用堆内存,就没有其他方法可以处理它。

P.S:此时我不能使用矢量。

【问题讨论】:

  • 要理解指针,请考虑指针是对程序存在的实际 RAM 的引用。像 C 这样的经典强类型语言要求在运行时内存中的所有变量都是类型化的。因此,例如,可以为 32 位整数类型留出 4 字节的内存块。为了适当地分开读取、写入和使用,内容大小和类型必须在编译期间以静态方式直接识别。看起来您的分配不会使用堆内存,而是被视为普通数组。阅读有关 malloc() 的文档以了解动态分配。

标签: c++ arrays pointers heap-memory


【解决方案1】:
int arNumbers[20];

从堆栈中为您提供内存,并且不是动态的,编译器会负责释放内存。

int *pNumbers = new int[20];

从堆中为您提供内存并且是动态的,您需要在完成后将其删除:

delete[] pNumbers;

如果你需要 20 个数字,一个就足够了。

【讨论】:

    【解决方案2】:

    int *ptr 未初始化,因此它实际上指向“垃圾值”,或者在这种情况下,是随机内存地址。查看Uninitialized pointers in code

    如果你想让int *ptr指向数字的值,你应该首先初始化int numbers,因为如果你试图取消引用它会导致Undefined behavior

    您可以使用地址运算符& 将ptr 分配为等于numbers。然后使用解引用运算符* 来获取ptr 的值。

    numbers = 4;
    ptr = &numbers;
    cout << *ptr << endl;
    

    这将打印4

    【讨论】:

    • 指向未初始化的变量不会导致任何“未定义的行为”,除非您尝试取消引用它。
    • @AlexLop。谢谢你。已编辑。
    • 不过,在指向变量之前不必初始化它...
    • @AlexLop。是的,我的措辞很糟糕。
    【解决方案3】:

    int *ptr 是指向int 变量的指针。什么变量都没有关系,只要它是int,那么您就可以拥有以下内容。

    int size;
    int bytes;
    int numbers;
    int *ptr;
    
    ptr = &size;
    ptr = &bytes;
    ptr = &numbers;
    

    我使用&amp; 符号,因为它给出了变量的实际地址而不是它的值。指针只能存储变量的地址。

    如果你想使用指针指向的实际值,你需要尊重它,像这样

    int number = 5;
    int *ptr;
    ptr = &number;
    cout << *ptr;   
    //5
    

    关于你的第二个问题。是的,这会给你一个指向堆上数组的有效指针。

    有关更多信息,我建议查看数组的实际含义,因为您可能会感到困惑,为什么在分配指向数组的指针时不需要使用 &amp; 符号。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 2018-08-31
      • 2012-05-12
      • 2011-09-14
      • 2013-04-05
      • 2015-04-06
      • 1970-01-01
      • 2013-03-27
      • 2023-04-09
      相关资源
      最近更新 更多