我在Pointers上经历了这一章并且遇到了这句话:
您将使用指针来处理已分配的变量 在堆上。 (您可以使用指针来处理堆栈变量,但是 在大多数情况下,这不是必要的。)
我知道如何使用指针来处理已在堆上分配的变量。但我无法想象它如何用于处理堆栈变量。由于堆栈变量在函数退出时自动解除分配(即变量被推出堆栈),如何在不使用类似free
系统调用的情况下使用指针(如上面引用的文本所暗示)完成相同的操作?这可能吗?
答案 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;
}