扩展 | 字符数组与字符串之间区别&函数的使用方法
文章目录
一、字符数组与字符串之间区别
1、字符数组及字符串的定义与初始化
1)字符数组是用来存放字符的数组,数组元素的类型是char型,元素用单引号;
初始化时,可以指定数组的大小(含有多少个元素)、可以对数组全部或者部分赋值初始化,也可以用字符串对数组进行初始化。
2)字符串就是用双引号括起来的任意字符序列,可以看作是一个个单个字符的数组,但是字符串的末尾有’\0’结束标记。
初始化时,可以把字符串直接赋值给一个字符数组,也可以用字符型指针变量。
2、他们在内存中存储的形式
字符数组和字符串在内存中都是连续存储的。不同的是,字符串在一个字符串的结尾会有’\0’结束标记,但是字符数组没有。
3、字符串的表示形式
字符串可以用printf()函数配合%s和puts()函数来表示,也可以把字符串当作是一个数组,只输出其中一个元素。
4、赋值方式的不同
字符串数组可以对数组中任意一个元素赋值,可以在定义的时候用字符串为其赋值,但是定义了一个字符数组之后,在后面为其赋值不可以用字符串了。
字符串在定义时可以用字符串直接赋值,在使用时,也可以对其中的某个元素进行更改。字符型指针字符串在使用时可以再次用字符串进行赋值,但是字符数组定义的字符串不行。
5、字符数组及字符串的处理函数
gets(s) 字符串输入函数,输入的字符串存储到s中
puts(s) 字符串输入函数,输出的时s中储存的数据,遇到’\0’结束输出
strcpy(s1,s2) copy 字符串复制函数,把后者复制到前者中
strcat(s1,s2) 字符串连接函数,把后者接到前者末尾
strcmp(s1,s2) 字符串比较函数,两者相等返回0,前者大于后者后者返回1,后者大于前者返回-1
strchr(s,ch) 字符查找函数,返回ch第一次在s中出现时的地址
strstr(s1,s2) 字符串查找函数,返回s2第一次在s1中出现的地址
6、字符数组及字符串作为函数的参数
当字符数字做函数参数时。我们需要传递两个参数,一个是数组名(即字符数组的首地址),另一个是数组的长度。
字符串做函数参数的时候,如果定义的是字符型指针变量,则只需要传递一个变量就可以了,不需要传递长度。
二、总结函数的使用方法
1、函数的声明以及函数原型
函数的定义是函数具体功能实现的全部代码
函数的声明是当函数的定义在main函数之后时,在main函数先写一个函数声明,它不需要全部的代码,把花括号换成一个分号即可。
2、函数形参与实参的区别
形参是在函数定义时出现的参数,它随着函数被调用而出现,随着函数的结束而结束,它没有实际的数据,只是用来接收实参的值,然后在该函数内进行运算。
实参是一个函数在调用另一个函数时,把真真切切的数据传递给形参的变量,就是我们在调用函数时在函数的参数列表里写的变量名。
3、return 语句的作用
返回一个值给调用者,这个值与函数的返回值类型一致。
结束函数的调用,继续执行原来的步骤。
4、全局变量和局部变量的理解
全局变量可以在文件的任意位置访问,就像是空气几乎无处不在。
局部变量是只能在定义它的函数内才可以访问的变量,就像是你在家喷的香水,作用范围有限。
5、函数的传值调用及传址调用的区别
传值调用只是把实参的值复制一份给形参,被调用函数对形参的任何修改都不会影响或者改变实参。
传地址是把变量的内存地址传递给局部变量的一种传递方式,这样,它们就是真的联系在一起了,被调用函数对其进行操作相当于对外部的变量进行操作。
6、函数的递归调用
函数的递归调用就是在调用函数的过程中有出现了调用该函数本身。
递归调用也是函数的调用,只不过是自己调用自己。
三、代码演示
1、字符数组与字符串之间区别演示代码
#include<stdio.h>
#include<string.h>
void test_char(char array[], int len);
void test_str(char* str);
int main(void)
{
//字符串数组的定义
char array1[10];//仅定义
char array2[10] = {'q','w','e','r'};//定义并初始化
char array3[] = {"asdf"};//用字符串初始化
char array4[] = "zxcv";//用字符串初始化
//字符串的定义
char str1[] = "jkljkl";//利用字符型数组
char* str2 = "bnmbnm"; //利用字符型指针
printf("字符数组初始化后输出:\narray2 = ");
int i;
for(i=0;i<4;i++)
printf("%c",array2[i]);
printf("\narray3 = %s\n",array3);
printf("array4 = %s\n",array4);
printf("*************************************\n");
printf("字符串初始化后输出:\n");
puts(str1);
puts(str2);
//字符串处理函数
printf("*************************************\n");
int len = strlen(str1);
printf("求字符串长度的函数strlen(str1) = %d\n",len);
int a = strcmp(str1,str2);
printf("字符串比较函数strcmp(str1,str2) = %d\n", a);
char* b = strchr(str1,'k');
printf("字符串查找函数strchr(str1,'k') = %s\n", b);
char* c = strstr(str1,"lj");
printf("字符串查找函数strstr(str1,\"lj\") = %s\n", c);
printf("字符串复制函数:\n复制前:%s\n",str1);
strcpy(str1,str2);
printf("复制后:%s\n",str1);
//字符数组、字符串作为函数的参数
printf("*************************************\n");
test_char(array4, 4);
test_str(str1);
return 0;
}
void test_char(char array[], int len)
{
int i;
printf("数组作为函数参数时,需要传递长度参数:\n");
for(i=0;i<len;i++)
{
printf("%c\t", array[i]);
}
printf("\n");
}
void test_str(char* str)
{
int len = strlen(str);
int i;
printf("字符串作为函数参数时,不需要传递长度参数:\n");
for(i=0;i<len;i++)
printf("%c\t",str[i]);
printf("\n");
}
2、函数的使用方法演示代码
#include<stdio.h>
//这是函数声明
int compare(int a,int b);
void test_return(int a);
void test_var(void);
void jiaohuan(int m,int n);
void jiaohuan2(int* p1,int* p2);
int f(int n);
//全局变量定义及初始化
int global_var = 123;
int main(void)
{
//1、函数的声明与函数原型
//2、函数形参与实参的区别
printf("*************************************\n");
int x=4,y=5;
printf("函数形参与实参的区别");
printf("x,y中大的那个是%d\n",compare(x,y));
/*
这里的x,y是实参, compare()函数里定义的a,b是形参
调用函数的时候,只是把x的值给了a,把y的值给了b,仅此而已
*/
//3、return 语句的作用
printf("*************************************\n");
test_return(-889);
//4、全局变量和局部变量的理解
printf("*************************************\n");
int local_var = 456;//局部变量定义
test_var();
//5、函数的传值调用及传址调用的区别
int m = 666;
int n = 123;
printf("*************************************\n");
printf("函数的传值调用交换两个变量的值\n");
printf("交换前:m = %d\tn = %d\n",m,n);
jiaohuan(m,n);
printf("交换后:m = %d\tn = %d\n",m,n);
int* p1 = &m;
int* p2 = &n;
printf("函数的传址调用交换两个变量的值\n");
printf("交换前:m = %d\tn = %d\n",m,n);
jiaohuan2(p1,p2);
printf("交换后:m = %d\tn = %d\n",m,n);
//6、函数的递归调用
printf("*************************************\n");
printf("递归求斐波那契数列:\n");
int i;
int num;
printf("请输入一个数字:");
scanf("%d",&num);
for(i=1;i<=num;i++)
printf("%d\t",f(i));
return 0;
}
//这是函数原型
int compare(int a,int b)
{
return (a>b?a:b);
}
void test_return(int a)
{
printf("return语句测试函数:\n");
if(a>=0)
{
printf("a>=0,|a|=%d\n",a);
return;
}
if(a<0)
{
printf("a<0,|a|=%d\n",-a);
}
}
void test_var(void)
{
printf("全局变量和局部变量测试函数:\n");
printf("全局变量global_var = %d\n",global_var);
printf("自定义函数调用报错\n[Error] 'local_var' undeclared(未定义) (first use in this function)\n");
//printf("局部变量 local_var = %d\n",local_var);
/*
E:\chomework\2.c In function 'test_var':
[Error] 'local_var' undeclared(未定义) (first use in this function)
[Note] each undeclared identifier is reported only once for each function it appears in
*/
}
void jiaohuan(int m,int n)
{
int t;
t = m;
m = n;
n = t;
}
void jiaohuan2(int* p1,int* p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
//递归函数
int f(int n)
{
if(n<=2)
return 1;
return f(n-1)+f(n-2);
}