这几天复习了指针、数组、函数,所以联系起来可能比较混乱;不多说先上几个例子:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void contri(char *str) // 这是一个给字符指针分配空间的子函数
{
str = (char*)malloc(sizeof(char)*64);
}
int main()
{
char *str = "helloworld"; //给指针初始化了一下
contri(str);
// char *str = (char *)malloc(sizeof(char)*64);
printf("%s\n",str);
strcpy(str,"wwwhhhhhhhhhhhhhh");
printf("%s\n",str);
return 0;
}
我们把指针str初始化了一下然后进行如上操作;运行一下会出现什么效果呢,以先前的认知或者说是误解我们认为这段代码完全没有问题;不妨运行一下,会提示段错误;
原因大致如下:要用strcpy()函数必须先给指针分配空间,代码中把str直接传过去,传过去的是和"helloworld"首字母h的地址值,形参也是个指针,所以就指向字符串的的那段地址,所以给形参分配空间和实参没有任何关系,就会出现段错误。
要想不出现问题就得把指针的地址传过去,这样在子函数中操作就是对指针地址进行操作,就能改变实参中的指针的空间;修改代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void contri(char **str)
{
*str = (char*)malloc(sizeof(char)*64);
}
int main()
{
char *str = "helloworld";
contri(&str);
// char *str = (char *)malloc(sizeof(char)*64);
printf("%s\n",str);
strcpy(str,"wwwhhhhhhhhhhhhhh");
printf("%s\n",str);
return 0;
}
假如不用参数传递的方式,就直接用注释掉的那段代码,在主函数中直接对指针进行操作。
还有一个例子能很好地证明如果传递的是指针本身,就是啊他初始化的地址传过去,这个是时候能实现通过子函数改变指针内容这个功能主要是因为改变了原有字符串地址里面存放的内容:具体代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void string_revese(char*str,char*ptr)
{
int len, i;
len = strlen(str);
for(i = 0; i < len;i++)
{
*ptr = *(str + len - 1 - i);
ptr++;
}
}
int main()
{
int i;
char *str = "helloworld!";
char *ptr = (char*)malloc(sizeof(char)*64);
string_revese(str,ptr);
printf("%s\n",str);
printf("%s\n",ptr);
return 0;
}