说这话其实很牵强,更广泛的标题应该是《函数内修改变量的方法》,因为指针也是变量的一种嘛。但是我是在操作指针遇到的这个问题,遂还是以问题为标题。
开门见山:
1.以返回值返回
2.修改指针的地址
3.结构体内的指针的特殊性。
以一个简单的例子来说:
一.首先看它的错误实现
-
#include<stdio.h>
-
-
void test(char *dst, char *src)
-
{
-
dst = src;
-
}
-
-
int main(int argc, char **argv)
-
{
-
char *src = "hello world";
-
char *dst = NULL;
-
test(dst, src);
-
-
printf("dst = %s", dst);
-
while(1);
-
}
答案输出是 NULL,实际在test函数体里观察变量,会发现在函数体力dst实际已经指向了“hello world”
但是c语言是
传值操作,dst,和src传进去的都是变量的副本。
二.用return来实现
-
#include<stdio.h>
-
-
char* test(char *dst, char *src)
-
{
-
-
return dst = src;
-
-
}
-
-
int main(int argc, char **argv)
-
{
-
char *src = "hello world";
-
char *dst = NULL;
-
-
dst = test(dst, src);
-
-
printf("dst = %s", dst);
-
while(1);
-
}
发现得到的是正确答案,不多解释。
三.不用返回值,修改指针指向的位置
-
#include<stdio.h>
-
-
void* test(char **dst, char *src)
-
{
-
-
return *dst = src;
-
-
}
-
-
int main(int argc, char **argv)
-
{
-
char *src = "hello world";
-
char *dst = NULL;
-
-
test(&dst, src);
-
-
printf("dst = %s", dst);
-
while(1);
-
}
-
void* test(char **dst, char *src)
test(&dst, src);
传进去的实际上是指向dst这个指针变量的指针,即指针的指针,修噶爱*dst,即相当于修改指针指向的位置(突然发现这里调用函数和被调用函数名字一样很不好解释。)
通过指向指针的指针**P,修改指针*p,这里传进来的副本是**p,在怎么修改**p在函数体外都不变。修改**p的值,即修改内存中*p的值,从而得到想要的结果。
其实说到头来,我们都可以用最早学习的例子swap的原理来说明。
四.结构体内指针的特殊性
如果我们想改变结构体中某个变量,需要传递一个指向该结构体的指针!
这样,不管你想改变的是结构体中的成员是一个普通变量还是一个指针,都是可以改变的,因为通过该结构体指针,
可以获得
该结构体(也是该结构体中第一个成员)的地址,进而也就知道了结构体中任一成员的地址,
因此对于结构体内容,想怎么改变就怎么改变!
所以说特殊,一点也不特殊。
参考
http://blog.csdn.net/laojing123/article/details/6544275
阅读(2238) | 评论(0) | 转发(0) |