主要是看这篇文章:
二级指针作为函数参数_二级指针做函数参数-CSDN博客
对里面的程序进行一些修改和补充,调试加更多说明。
1、一级指针情况:
#include"stdio.h"
int my_strlen1(const char* str)
{
int count = 0;
int i = 0;
if (NULL == str)
{
return -1;
}
printf("strlen1.str : %s\n", str);
while (*str != '\0')
{
str++;
count++;
}
printf("strlen1.str : %s\n", str);
return count;
}
int main()
{
const char* str = "hello world";
printf("%d\n", my_strlen1(str));
printf("main.str : %s\n", str);
return 0;
}
因为我的平台是这样的:
可能C语言标准比较旧,所以原文中main函数中定义字符串指针时不需要用常字符串指针,但是我这里不用就报错,所以都改为常字符串指针,对应子函数形参也修改。下同。
在子函数传进来指针后,在改变指针值之前就加一个打印指针指向的值语句。下同。
打印结果:
按照原文最后的说法,这里子函数中的一级指针是主函数中一级指针的副本,其只在子函数内部起作用,子函数内修改这个指针,运行完,主函数的一级指针并未有影响。
2、二级指针
#include"stdio.h"
int my_strlen2(const char** str)
{
int count = 0;
int i = 0;
if (NULL == *str)
{
return -1;
}
printf("strlen2.str : %x\n", *str);
while (**str != '\0')
{
(*str)++;
count++;
}
printf("strlen2.str : %x\n", *str);
return count;
}
int main()
{
const char* str = "hello world";
printf("main.str : %x\n", str);
printf("%d\n", my_strlen2(&str));
printf("main.str : %x\n", str);
return 0;
}
因为子函数中str是二级指针,所以修改原程序中打印*str时用字符格式%s,那样是打印不出来的。或者说打印是空的。原文中结果就是这样。用打印十六进制值%x代替。
打印结果:
和上面结果对照看,所以,调用子函数确实是改变了主函数的指针值。
3、再次修改第一段代码,更明显看指针值改变:
#include"stdio.h"
int my_strlen1(const char* str)
{
int count = 0;
int i = 0;
if (NULL == str)
{
return -1;
}
printf("strlen1.str : %x\n", str);
while (*str != '\0')
{
str++;
count++;
}
printf("strlen1.str : %x\n", str);
return count;
}
int main()
{
const char* str = "hello world";
printf("main.str : %x\n", str);
printf("%d\n", my_strlen1(str));
printf("main.str : %x\n", str);
return 0;
}
结果:
调用完后,主函数中的str值并不等于子函数调用完后的str值!