C语言总结

这篇博客详细总结了C语言的基础知识,包括数据类型、变量、内存四区、C语言关键字、各种语句(如循环和判断)、数组、指针、字符串操作、手动内存分配以及常见的排序算法(冒泡排序、选择排序和快速排序)。还探讨了变量的声明、内存管理、字符串函数的实现和指针的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据类型

《1》数据类型的本质:
数据类型可理解为创建变量的模具,是固定大小的内存的别名;

《2》作用:
编译器预算变量分配内存的大小
如:
char,一个字节大小的内存,
int,四个字节大小的内存,
long,四个字节大小的内存,(32位编译器)等

《3》数据类型可定义别名
使用 typrdef 定义别名;
如:

typedef int INT;
INT age;
//相当于int age;

二 、变量

《1》变量的本质:
变量是内存空间的别名,是一个标号;

《2》分类:
全局变量,局部变量

《3》修改变量的方法:
(1)直接修改
(2)间接修改

《4》void 无类型

void * 无类型指针,可只想任意类型的数据
(1)用于数据类型的封装
(2)修饰函数返回值的首地址或参数,表示无返回值
(3)void * 指针的意义:
把一个不知道类型的首地址给传出来
例如:

void* getchar_1()
{
    void *p=(void *)malloc(100);
    return p;
}

三、内存四区

《1》内存四区:
堆区、栈区、全局区(常量区)、代码区
《2》规则
(1)规则一、main()函数分配的内存在堆区、栈区、全局区都可以在被调函数中使用;
(2)规则二、在被调函数中分配的内存,属于局部变量,在函数结束时,变量销毁,主调函数不可使用;如以下场景是错误的:

char* getstring1()
{
    char buf[30];
    strcpy(buf,"abcdefg");
    return buf;//buf[30]为局部变量,函数结束时,变量被销毁;
}

(3)主函数能调用很多函数,但是,依然只有一个堆区一个栈区、

图一

四、C语言关键字:

详情见博客:
http://blog.youkuaiyun.com/dai_wen/article/details/78277156

五、语句

1、三种循环:

〈1〉for循环
(一般采用左闭右开区间,切忌在循环体内改变变量)
for循环是有效的循环之一;for(起始条件;判断条件;循环条件)
如:

int i,num=20;
for(i=0;i<num;i++) 
{
    //循环体
}

〈2〉while循环

while(判断条件)
{
    //循环体
}

〈3〉do…while()循环

do{
    //循环体
}while(判断条件)
2、判断语句( if 和0比较)

〈1〉判断真假

if(flag)
{
    //
}

〈2〉整数和0比较

if(age==0)
{
}

<3>指针变量和0比较

int *p=NULL;
if(p!=NULL)
{
    *p=NULL
}

<4>浮点型和0比较

//给一个精度范围:
#define exp 0.00000001
#include<stdio.h>
int main()
{
    double d=0.1;
    if( (d> -exp ) && (d < exp ) )
    {
        //处理语句
    }
    return 0;
}
3、选择语句switch( )

〈1〉语法结构

switch( 选择条件 )
{
    case 常量表达式1: /* 语句;*/  break;
    case 常量表达式2:/* 语句;*/  break;
    //...
    case 常量表达式n:/* 语句;*/  break;
}
4、break 和continue的区别

break放在循环内部:用于直接结束循环,
continue放在循环内部:用于结束本次循环,继续执行下一次循环

典型例子:(while实现字符首尾缩进)
http://blog.youkuaiyun.com/dai_wen/article/details/75637204

5、折半查找法

对有序序列使用折半查找法查找元素,如下图所示:
图二
(1)折半查找法查找数字

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int binary_search(int arr[],int key, int sz ) 
{
    int left=0;
    int right=sz-1;

    while(left<=right)
    {
        int mid=(left+right)/2;
        if( key == arr[mid] )
            return mid;

        else{
                if(key>mid)
                    left = mid+1;
                else 
                    right = mid-1;
        }
  } 
    return -1;
}

int main()
{
    int array[]={1,2,3,4,5,6,7,8,9};
    int key=7;
    int sz = sizeof(array)/sizeof(array[0]);
    int ret =binary_search(array,key,sz);
    if( ret == -1 )
    {
        printf("找不到\n");
    }
    else  printf("找到了ret:  \n",ret);
    return 0;
}

(1)折半查找具体:
http://blog.youkuaiyun.com/dai_wen/article/details/75637166
(2)利用折半查找实现猜数字游戏:
http://blog.youkuaiyun.com/dai_wen/article/details/75639675

六、数组

数组从内存角度来说,是一片连续大小的内存块,存储相同大小的数据元素;
详情见:
http://blog.youkuaiyun.com/dai_wen/article/details/79215601

七、指针

没有内存哪来指针啊
(1)指针是用来指向一段内存块,

(2)指针指向谁,就把谁的地址赋给指针

(3)指针三大铁律:
《a》指针铁律一:指针也是一种变量,具有内存空间,用来保存地址
《b》指针铁律二:通过(*p)和(*p++)来改变变量的值是指针存在的最大意义
《c》指针铁律三:理解指针,必须和内存四区相结合

(4)特别注意野指针问题(对已经释放的空间再次使用,造成对同一块内存空间多次释放)

八、数组指针:

《1》数组指针详情
http://blog.youkuaiyun.com/dai_wen/article/details/79204255

《2》数组指针和指针数组的区别

//数组指针和指针数组形式很像,但是很容易区分
//主要是看操作符的优先级,()[]的操作符优先级一样,结合方向从左至右
char *array[30];//先看[30],是数组,在看char* ,存放指针,所以是个存放指针的数组,指针数组
char (*array)[30];//先看(*array),是个指针,再看[30],所以是个 数组指针

九、字符串

1、模拟实现strcpy

http://blog.youkuaiyun.com/dai_wen/article/details/79141922

2、 strlen,strcpy,strcat,strcmp,strstr,memcpy,的模拟实现方式

http://blog.youkuaiyun.com/dai_wen/article/details/77966014

3、 如何将字符串反转

http://blog.youkuaiyun.com/dai_wen/article/details/79184884

4、 如何删除字符串中的空格

http://blog.youkuaiyun.com/dai_wen/article/details/79175900

5、 求子字符串在另一字符串中出现的次数

http://blog.youkuaiyun.com/dai_wen/article/details/79142733

6、 将字符串奇偶位的字符分离保存

http://blog.youkuaiyun.com/dai_wen/article/details/79187784

十、手动分配内存空间(malloc、colloc、 realloc)

详情见:
http://blog.youkuaiyun.com/dai_wen/article/details/78407709

1、malloc

《1》malloc()和free()必须配对使用

int *p=(int *)malloc(40);
if( p == NULL )
{
    printf("out of memory");
    exit(EXIT_FAILURE);
    }
        for(i=0;i<10;i++)
        {
            *(p+i)=10-i;
        }   

free( p );
p = NULL;
2、colloc
int * ptr=(int *)calloc(10,sizeof( int ));//将数组元素初始化为0
if( ptr == NULL )
{
    printf("out of memory");
    exit(EXIT_FAILURE);
}
free( ptr );
ptr=NULL;
return 0; 
3、realloc

重新开辟空间,主动释放空间,无须手动释放

http://blog.youkuaiyun.com/dai_wen/article/details/77880167

十一、排序法

1、冒泡排序法

相邻元素向比较,大的往下沉,小的往上浮;
所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法。具体方法是,相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到最后没有数值需要交换,则排序完成。

2、选择排序法

用一个元素和其它所有元素进行依次比较;
简单选择排序的基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

3、快速排序法

 在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。

十二、结构体

http://blog.youkuaiyun.com/dai_wen/article/details/79381296
本文不全,有待改进>_<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值