扩展 | 字符数组与字符串之间区别&函数的使用方法

一、字符数组与字符串之间区别

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);
 } 

猜你喜欢

转载自blog.csdn.net/l2754283833/article/details/115017679