个人技术分享

一、函数

函数是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函数
  1. 头文件:

    #include <string.h>

  2. 函数原型:

    size_t strlen(const char *s);

  3. 函数功能:

    计算字符串长度

  4. 返回值:

    字符串长度


  5. (1)不将’\0’计算在内
    (2)参数是一个char类型的指针
    (3)求的是字符串的实际长度,会从开始开始计算直到遇到第一个’\0’

2、strcpy函数头文件:
  1. 头文件:

    #include <string.h>

  2. 函数原型:

    char *strcpy(char *dest,const char *src);

  3. 函数功能:

    把src指向的字符串复制到以dest指向的地址空间

  4. 返回值:
    返回dest的指针

  5. 备注:
    (1)单个字符进行复制,会将src中的’\0’也复制过去

3、strcat函数
  1. 头文件:

    #include <string.h>

  2. 函数原型:

    char *strcat(char *dest, const char *src);

  3. 函数功能:

    将src指向的字符串拼接到dest指向的字符串的结尾处
    。要保证dest足够长,以容纳被复制进来的src。*src中原有的字符不变。返回指向dest的指针。

  4. 返回值:

    返回指向dest的指针

  5. 备注:
    (1)会将src指向的字符串(包括“\0”)复制到dest所指向的字符串的最后。
    (2)会删除*dest原来末尾的“\0”
    (3)src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串

4、strcmp函数
  1. 头文件:

    #include <string.h>

  2. 函数原型:

    int strcmp(const char *s1, const char *s2);

  3. 函数功能:

    比较字符串s1和s2的大小

  4. 返回值:

    两个字符串相等为0;s1>s2,正数;s1<s2,负数。

  5. 备注:
    (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;
            }                                                                                                                                                                         
        }
    }   
}