C语言中的指针存储

C语言中的指针存储,c,C,在C语言中,指针包含另一个变量的内存位置。指针变量存储在堆栈上还是堆上?它存储在某个地方 这取决于您,您如何定义指针 如果它是一个局部变量,它可以在堆栈上,也可以在寄存器中。 如果您通过malloc()创建它,它就在堆上。 或者全局,如果它是在模块范围内定义的 int *pInt_global; void foo(void) { int *pIntStack; int **ppIntHeap; ppIntHeap = malloc(sizeof(int *)); } 它存放在

在C语言中,指针包含另一个变量的内存位置。指针变量存储在堆栈上还是堆上?

它存储在某个地方

这取决于您,您如何定义指针

如果它是一个局部变量,它可以在堆栈上,也可以在寄存器中。
如果您通过malloc()创建它,它就在堆上。
或者全局,如果它是在模块范围内定义的

int *pInt_global;

void foo(void)
{
  int *pIntStack;

  int **ppIntHeap;

  ppIntHeap = malloc(sizeof(int *));
}

它存放在某个地方

这取决于您,您如何定义指针

如果它是一个局部变量,它可以在堆栈上,也可以在寄存器中。
如果您通过malloc()创建它,它就在堆上。
或者全局,如果它是在模块范围内定义的

int *pInt_global;

void foo(void)
{
  int *pIntStack;

  int **ppIntHeap;

  ppIntHeap = malloc(sizeof(int *));
}

指针只是一个变量。将其视为保存内存位置的整数,因此如果您有:

int main(...) {
    char *ptr = malloc( 100 );
    ...
}

然后
ptr
是堆栈上的一个四字节或八字节值,其中包含从堆中分配的100字节缓冲区的内存位置。内存本身在堆中,指针在堆栈上。

指针只是一个变量。将其视为保存内存位置的整数,因此如果您有:

int main(...) {
    char *ptr = malloc( 100 );
    ...
}

然后
ptr
是堆栈上的一个四字节或八字节值,其中包含从堆中分配的100字节缓冲区的内存位置。内存本身在堆中,指针在堆栈上。

视情况而定。堆内存是用malloc创建的,堆栈内存不是用malloc创建的(简而言之,但我也应该谈谈静态内存)

这里,ps包含堆栈(a)中变量的地址,ph包含堆中变量的地址。请注意,如果malloc没有失败,则两者都引用值5。还要注意,分配给ph的内存应该在某个时候释放,而不是从ps释放


如果在函数中接收到指向某个对象的指针,则无法知道该对象是从堆栈还是从堆引用内存。

这取决于具体情况。堆内存是用malloc创建的,堆栈内存不是用malloc创建的(简而言之,但我也应该谈谈静态内存)

这里,ps包含堆栈(a)中变量的地址,ph包含堆中变量的地址。请注意,如果malloc没有失败,则两者都引用值5。还要注意,分配给ph的内存应该在某个时候释放,而不是从ps释放


如果在函数中接收到指向某个对象的指针,则无法知道它是引用堆栈中的内存还是引用堆中的内存。

可能是其中之一。取决于指针的存储方式^Angus,从内存的角度来看,指针是一个相互类似的变量,那么它既可以存储在堆中(如果已分配或全局),也可以存储在堆栈中(如果本地)。当然,如果将指针声明为局部变量,则它很可能位于堆栈上,但如果全局声明,则它很可能位于堆上。可能对您有帮助。这取决于您如何存储指针^Angus,从内存的角度来看,指针是一个彼此相似的变量,那么它可以存储在堆(如果是分配的或全局的)或堆栈(如果是局部的)。当然,如果您将指针声明为局部变量,那么它很可能位于堆栈上,但是如果您全局声明它,它很可能会在堆上。谢谢你帮助我理解。谢谢你帮助我理解。谢谢你帮助我理解。你已经给我解释清楚了。谢谢你帮我理解。你已经给我解释清楚了。