欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2023-12-21 23:23:28
...

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

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);
 } 
相关标签: C语言 c语言

上一篇:

下一篇: