一般来讲,更改变量空间所存储的信息有两种方式
直接改变
间接改变
直接改变变量的空间,是再简单不过的一件事情。比如:
int a;//在栈中开辟sizeof(int)大小的空间,空间名为a
在栈中开辟sizeof(int)大小的空间(在32位机下,大小为4B),空间名为a
。此时,名为a的这4个字节的空间是茫茫栈中再普通不过的了。由于我们并没有为其赋值,因此,这4个字节里的信息我们并不确定。
假如我们要给a赋值,也就是让这4个字节里面存储的是我们想要它存储的值,我们可以采用直接法:
a=100;
当然也可以采用间接法!
间接法改变变量,其本质就是通过地址实现。比如:
int b;
int *p=&b;
*p=200;
这是采用间接法改变变量值的其中一种。还有很多其他情况。比如:
函数传指针做参数
结构体成员赋值
由于函数只有一个返回值,当我们想返回两个值甚至更多时,仅仅依靠函数的返回值就显得有点心有余而力不足了。那么怎末解决这个需要呢?答案是传地址,也就是传指针类型的参数。比如:
void foo(int a,int b,int *sum,int *dif )
{
*sum=a+b;
*dif=a-b;
}
函数可以通过传参的方式改变变量的值,这也是我们要经常运用的编程技巧。
结构体成员赋值也是我们经常会见到的。如:
typedef struct node
{
int data;
struct node *next;
}Node,*Pnode;
void Input(Node node)
{
node.data=5;
node.next=(Node *)malloc(sizeof(Node));
}
不过,很遗憾,这种在函数中使用点运算符来给结构体成员赋值的方法并不可行。其原因就是函数传参的非指针性。函数参数为结构体类型,这表明程序执行时会在主函数栈中为Input函数开辟一个存储形参的空间,所以,当我们以这种方式来修改结构体成员的值时,实际上只是操作了形参空间的数据,并没有改变原本结构体成员空间的数据。
所以,我们只能通过传结构体指针变量的方法,来实现函数中对结构体成员的赋值。代码如下:
void Input(Node *pt)
{
pt->data=5;
pt->next=(Node *)malloc(sizeof(Node));
}
总之,想要通过间接的方式修改变量的地址,就必须传指针。此之谓:改变谁,就穿谁的地址!