处理Stack变量的指针示例

时间:2015-10-18 12:51:10

标签: c pointers stack

我在Pointers上经历了这一章并且遇到了这句话:

  

您将使用指针来处理已分配的变量   在堆上。 (您可以使用指针来处理堆栈变量,但是   在大多数情况下,这不是必要的。)

我知道如何使用指针来处理已在堆上分配的变量。但我无法想象它如何用于处理堆栈变量。由于堆栈变量在函数退出时自动解除分配(即变量被推出堆栈),如何在不使用类似free系统调用的情况下使用指针(如上面引用的文本所暗示)完成相同的操作?这可能吗?

5 个答案:

答案 0 :(得分:1)

您可以使用 address-of 运算符&获取局部变量的地址(在堆栈上分配)。然后可以将该地址存储在指针中,并使用它指向堆上的变量。但是,您应该 free()存储的地址,因为这会构成未定义的行为。

答案 1 :(得分:1)

简单示例:

int i;
scanf("%d", &i);

指向堆栈变量i的指针传递给scanf(),以便将结果存储在那里。

答案 2 :(得分:1)

使用带有堆栈变量的指针的常见示例:从另一个函数修改局部变量的值。

#include <stdio.h>

void hoge(int *a) {
    *a = *a + 10;
}

int main(void) {
    int foo = 5;
    printf("%d\n", foo);
    hoge(&foo);
    printf("%d\n", foo);
    return 0;
}

答案 3 :(得分:0)

在函数内部,您可以使用指针算术并在堆栈上引用变量。 变量在函数开头被压入堆栈并在最后弹出。

在这个例子中,您可以通过a的地址访问b(记住在堆栈What is argument push order上推送的参数的顺序)。

void fnc(unsigned int a, unsigned int b) {
    unsigned int *pb = (unsigned int *)((long)&a - (long)sizeof(int));
    printf("%d\n", *pb);
}

答案 4 :(得分:0)

交换两个变量值的一种非常流行且已知的方法是另一个例子。

#include <stdio.h>

void Swap(char *x,char *y);

int main(void)
{
    char character1 = 'a';

    char character2 = 'z';

    Swap(&character1,&character2);

    printf("character1 now is : %c\n",character1);

    printf("character2 now is : %c\n",character2);
}

void Swap(char *x,char *y)
{
    char tmp;

    tmp = *x;

    *x = *y;

    *y = tmp;
}