目录
一、函数
函数是C语言的执行单位,函数可以将C语言的代码进行模块化。
封装函数要求(高内聚,低耦合):功能单一,执行与其他代码关联性小。
(一)定义
<返回值类型> 函数名(<形式参数列表>)
{
//函数体code
return 返回值;
}
1. 返回值类型
C语言中,一个函数只能返回一个值,不能返回多个值。
2. 函数名
函数名命名规则与标识符命名规则一致。
3. 参数
习惯上函数的参数小于4个。
函数的参数可以是数组和指针类型。
- 注:形式参数是实际参数的一个临时拷贝,形式参数的值的改变不会影响实际参数。
4. 函数的声明
<返回值类型> 函数名(<形式参数列表>);
函数在使用前需要提前声明。
如果函数实现在调用之前,则不需要再次进行声明。
eg: 实现一个计算字符串长度的函数len
#include <stdio.h>
int len(char s[]);
int main(int argc, const char *argv[])
{
char str[128];
int length=0;
//输入一个字符串
printf("please input a string :");
scanf("%s",str);
length=len(str);
printf("sum:%d\n",length);
return 0;
}
int len(char s[]) //形参可以是数组
{
int len=0;
//遍历字符串,直至遇到\0
while(s[len])
{
len++;
}
return len;
}
(二)常用的字符串函数
1、strlen函数
-
头文件:
#include <string.h> -
函数原型:
size_t strlen(const char *s); -
函数功能:
计算字符串长度
-
返回值:
字符串长度
-
注
(1)不将’\0’计算在内
(2)参数是一个char类型的指针
(3)求的是字符串的实际长度,会从开始开始计算直到遇到第一个’\0’
2、strcpy函数头文件:
-
头文件:
#include <string.h> -
函数原型:
char *strcpy(char *dest,const char *src); -
函数功能:
把src指向的字符串复制到以dest指向的地址空间
-
返回值:
返回dest的指针 -
备注:
(1)单个字符进行复制,会将src中的’\0’也复制过去
3、strcat函数
-
头文件:
#include <string.h> -
函数原型:
char *strcat(char *dest, const char *src); -
函数功能:
将src指向的字符串拼接到dest指向的字符串的结尾处
。要保证dest足够长,以容纳被复制进来的src。*src中原有的字符不变。返回指向dest的指针。 -
返回值:
返回指向dest的指针
-
备注:
(1)会将src指向的字符串(包括“\0”)复制到dest所指向的字符串的最后。
(2)会删除*dest原来末尾的“\0”
(3)src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串
4、strcmp函数
-
头文件:
#include <string.h> -
函数原型:
int strcmp(const char *s1, const char *s2); -
函数功能:
比较字符串s1和s2的大小
-
返回值:
两个字符串相等为0;s1>s2,正数;s1<s2,负数。
-
备注:
(1)该函数对大小写敏感
二、指针
(一)概念
指针是一个变量类型,主要用来申请变量
指针变量:指针变量的本质是一个变量,变量里存放的是一个地址
(二)定义
<变量类型> *标识符;
(三)指针运算符
“&” 取址运算符,获取变量的地址
“*” 取值运算符
左值:*指针 = value; //获取指针指向的**“空间“**
int *p = 10;
*p = 20;
右值:*p //获取指针指向的空间的值,(没有等号默认是右值)
*p
(四)交换两个字符串的值
#include <stdio.h>
void swap(char *a, char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
char str1[128]="Hello world";
char str2[128]="I love C";
char *p1 = str1;
char *p2 = str2;
while(*p1!='\0'||*p2!='\0')
{
swap(p1,p2);
p1++;
p2++;
}
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
return 0;
}
输出结果:

eg: 字符串颠倒
#include <stdio.h>
int main(int argc, const char *argv[])
{
char arr[]="abcdef";
char *p_head= &arr[0];
char *p_tail = &arr[0];
while(*p_tail)
{
p_tail++;
}
p_tail--;
while(p_head<p_tail) //可以通过比较指针大小
{
char temp=*p_head;
*p_head=*p_tail;
*p_tail=temp;
p_head++;
p_tail--;
}
printf("%s\n",arr);
return 0;
}
(五)野指针
指针指向一个不确定的位置,就称之为野指针。
如何避免出现野指针:
定义指针时就要赋初值。如:int *tmp=NULL;
NULL空间不允许用户使用,使用时就会指针报错。
(六)指针运算
- 注:32位系统中指针占4个字节,64位系统中指针占8个字节,指针类型和指针所占的空间无关。
1. 指针加减数字的运算
指针+1/-1移动指向的;
#include <stdio.h>
int main(int argc, const char *argv[])
{
char arr[]="abcdef";
char *p_head= &arr[0];
char *p_tail = &arr[0];
while(*p_tail)
{
p_tail++;
}
p_tail--;
while(p_head<p_tail) //可以通过比较指针大小
{
char temp=*p_head;
*p_head=*p_tail;
*p_tail=temp;
p_head++;
p_tail--;
}
printf("%s\n",arr);
return 0;
}
2. 指针减指针
在数组中可以用于计算相差了几个元素
(七)使用
eg :通过指针实现字符串长度计算,字符串复制,字符串比较,字符串拼接
#include <stdio.h>
int mystrlen(char *s1);
void mystrcpy(char *s1, char *s2);
int mystrcmp(char *s1, char *s2);
void mystrcat(char *s1, char *s2);
int main(int argc, const char *argv[])
{
char s1[128]="hello world";
char s2[128]={0};
printf("len s1:%d\n",mystrlen(s1));
mystrcpy(s1,s2);
printf("%s\n",s2);
if(mystrcmp(s1,s2)==0)
printf("they are same\n");
mystrcat(s1,s2);
printf("s1:%s\n",s1);
return 0;
}
//统计字符串长度,并返回
int mystrlen(char *s1)
{
int len=0;
while(*(s1+len)!='\0')
len ++;
return len;
}
//将s1复制到字符串s2
void mystrcpy(char *s1, char *s2)
{
while(*s1!='\0')
{
*s2=*s1;
s2++;
s1++;
}
}
//比较两个字符串的大小,相等返回1
int mystrcmp(char *s1, char *s2)
{
while(*s1==*s2)
{
if(*s1=='\0')
return 0;
s1++;
s2++;
}
return *s1-*s2;
}
//拼接两个字符串
void mystrcat(char *s1, char *s2)
{
while(*s1 != '\0')
s1++;
while(*s2 != '\0')
{
*s1=*s2;
s1++;
s2++;
}
}
进阶版:
//统计字符串长度,并返回
int mystrlen(char *s1)
{
int len=0;
while(*(s1+len++)!='\0');
return len-1;
}
//将s1复制到字符串s2
void mystrcpy(char *s1, char *s2)
{
while(*s1!='\0')
{
*s2++=*s1++;
}
}
//比较两个字符串的大小,相等返回1
int mystrcmp(char *s1, char *s2)
{
while(*s1++==*s2++)
{
if(*s1=='\0')
return 0;
}
return *s1-*s2;
}
//拼接两个字符串
void mystrcat(char *s1, char *s2)
{
while(*s1 != '\0')
s1++;
//跳出循环后指针指向\0
while(*s1++=*s2++);
}
输出结果:

eg 选择排序
/*选择排序*/
#include <stdio.h>
void selsort(int *arr,int len);
int main(int argc, const char *argv[])
{
int arr[10]={12,2,4,76,32,9,44,75,46,88};
selsort(arr,10);
for(int i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
putchar(10);
return 0;
}
void selsort(int *arr,int len)
{
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}