【问题标题】:C++ pointers and the identity of pointer in terms of memory allocationC++ 指针和指针在内存分配方面的标识
【发布时间】:2014-08-14 16:04:18
【问题描述】:

作为编程专业概念的新手,我正在考虑 C++ 指针,它们是内存块的地址。从逻辑上讲,任何指向它们的东西都确实指向第一个变量。

如果int x = 0; 那么如果int y points to int x;现在再次如果int c points to int y,它确实指向int x;我认为这是真的吗?

我的问题是,关于int yint c,作为两个指针变量,C++中如何管理它们自己的内存?

一般来说,我的问题是如何为指针本身处理内存分配?因为指针本身是组织内存的一种重要方式。

提前致谢

【问题讨论】:

  • 一个int 保存一个特定范围内的整数值。它没有指向任何东西。

标签: c++ c pointers memory memory-management


【解决方案1】:

如果你的意思是

int x = 0;
int* y = &x;
int* c = y;

那么是的,yc 都指向x 在内存中的位置。

另外,yc 都是不同的变量,它们都有自己的内存分配。这可以通过打印变量的地址轻松验证,即打印&y&c


更形象地说,是这样的:

int x = 0;

分配一些内存并将其初始化为零:

+---+ | x | +---+

然后

int* y = &x;

看起来像这样:

+---+ +---+ |是 | --> | x | +---+ +---+

最后

int* c = y;

会让一切看起来像这样:

+---+ |是 | --\ +---+ \ +---+ >--> | x | +---+ / +---+ | c | --/ +---+

还要注意,指针变量与任何其他整数变量实际上没有什么不同,其值只是它们指向的地址。只是编译器对它们的处理方式比较特殊。

【讨论】:

  • 我认为 OP 有第二个问题,尽管这正确回答了他们的第一个问题。第二个是,对象yc 是内存中的不同对象(指针本身)。
  • 不,我不是那个意思。我的意思是 y 和 c 持有一个地址。他们自己的内存是如何计算的。因为它们应该存在于进程中,以便进程了解它拥有一个地址。
  • 嗯...虽然“整数”在技术上确实意味着“与整数集有关”,但我仍然认为最好坚持使用“整数”作为形容词的不合语法但明确的用法。
  • @JanDvorak 这很公平,但是这个标准函数有问题。 en.cppreference.com/w/cpp/types/is_integral
  • @JanDvorak 哦,但这也存在en.cppreference.com/w/cpp/types/numeric_limits/is_integer。嗯
【解决方案2】:

指针就像其他变量一样,因此它们的分配方式与其他变量一样。 (如果是自动变量,可以在堆栈上分配,如果是动态分配,则可以在堆上分配,如果指针是静态/全局的,则可以在数据段中分配)

例如:

int x = 0;
int *y = &x;
int *z = y;

这里y和z是在栈上分配的,它们都包含x的地址。

y 和 z 是指向同一位置 x 的两个不同对象。

作为一个类比,你可以看下面的例子

int a = 42;
int b = 42;

这里ab 是两个不同的变量,包含相同的值。

【讨论】:

  • 谢谢。我想要这个答案。这意味着它们只是常规变量?很好。
  • 是的,确实如此。您稍后可以选择z 指向不同的内存位置,而y 可能会继续指向旧位置,yz 将不再指向同一位置。
【解决方案3】:

如果int x = 0; 那么如果int y points to int x;现在再次如果int c points to int y,它确实指向int x;我认为这是真的?

没有。如果你的意思是

int x = 0;
int *y = &x;
int **c = &y;  

然后y*c 指向xc 指向y

我的问题是如何为指针本身处理内存分配?

指针本身是在堆栈上分配的,但它们指向的对象可能在堆上分配,就像在

的情况下一样
int *p = malloc(sizeof(int*10)); 

【讨论】:

  • @KerrekSB;你能详细说明一下吗?
  • 所有这些变量都可以有静态存储。
  • @KerrekSB;是的。我说指针的内存在堆栈上。怎么了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2016-02-21
  • 2012-03-15
  • 2013-05-06
  • 1970-01-01
相关资源
最近更新 更多