版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33706673/article/details/84669784
1. 一维指针做函数参数
传入的指针为NULL
比如下面的例子,很多人都会理解错:
#include <stdio.h>
void test(char *string)
{
string = "hello world";
}
int main()
{
char *str = NULL;
test(str);
printf("str=%s\n",str);
return 0;
}
是不是觉得输出应该是:str=hello world.事实上并不是
输出结果是(操作系统:win10):
具体过程如下:
开始str指针指向NULL,并将该地址作为形参传入函数test(),最开始string指针也是指向NULL,接着讲“hello world”地址传给了string,此时string的指针不再指向NULL,而是指向“hello world”这个字符串的地址。为了验证这个,可以在代码里加一些打印信息验证:
#include <stdio.h>
void test(char *string)
{
printf("string未操作之前的的指针:%p\n",string);
string = "hello world";
printf("string未操作之后的的指针:%p\n",string);
}
int main()
{
char *str = NULL;
printf("传入test函数之前str的指针:%p\n",str);
test(str);
printf("str=%s\n",str);
getchar();
return 0;
}
结果:
2.那要实现在test函数中改变str的指针指向地址怎么办?
2.1 返回string指针,这个很好理解
#include <stdio.h>
char *test(char *string)
{
string = "hello world";
return string;
}
int main()
{
char *str = NULL;
str = test(str);
printf("str=%s\n",str);
getchar();
return 0;
}
结果:
2.2 用二维指针
#include <stdio.h>
void test(char **string)
{
*string = "hello world";
}
int main()
{
char *str = NULL;
test(&str);
printf("str=%s\n",str);
getchar();
return 0;
}
结果:
具体分析如下图:
过程:
1.定义一个字符串指针str,str本身的地址是100,值为0(即NULL,一般的编译器NULL的地址是0)。
2.取str的地址100传给string,此时string的值是100,地址为200
3.这里假设“hello world”字符串的地址是300,接下来就是改变一级指针指向的内容的地址,由0变成300。