C基础(学习)2024.7.25

Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC

数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2

运算符和输表达式,输入输出相关知识可以查看文档http://t.csdnimg.cn/FJe89

控制语句,if-else,switch-case,for,while,do-while,循环控制语句相关知识可以产看文档http://t.csdnimg.cn/zskY3

一维数组,字符数组相关知识可以查看文档http://t.csdnimg.cn/1weqY

排序(冒泡排序和选择排序),二维数组相关知识可以查看文档http://t.csdnimg.cn/hvo5C

指针相关知识(概念,格式,初始化,指针运算)可以查看文档http://t.csdnimg.cn/8lop0

指针补充知识(指针修饰,二级指针,指针和数组,数组指针和指针数组)可以查看文档http://t.csdnimg.cn/m11Mj

目录

函数

基本用法

1.函数的三要素:功能,参数,返回值

2.函数声明和定义

(1)函数声明

(2)函数定义

3.函数调用

4.函数传参

(1)值传递

(2)地址传递

(3)数组传递

5.函数和栈区

(1)概念

(2)总结

开辟堆区(heap)空间

1.堆区的概念

2.堆区的特点

3.堆和栈的区别

[malloc 函数](#malloc 函数)

1.定义

[2 用法](#2 用法)

[3. free()函数定义](#3. free()函数定义)

4.函数中开辟堆区空间

string函数族

1.strcpy

2.strcat

3.strlen

4.strcmp

函数

基本用法

1.函数的三要素:功能,参数,返回值

功能:函数要实现的功能

参数:函数声明和调用时定义的变量,用于传递信息给函数

形参:只是一个声明的形式,形参是接受实参的参数;

实参:函数调用中实际传递给函数的参数,实参有具体的数据

返回值:函数调用后唯一留下的右值(只能放在运算符右边)

2.函数声明和定义

(1)函数声明

存储类型 数据类型 函数名(数据类型 形参1,数据类型 形参2,...);

(2)函数定义

存储类型 数据类型 函数名(数据类型 形参1,数据类型 形参2,...)

{

函数体;

}

函数名:标识符,要符合标识符的命名规则

数据类型:函数返回值类型,没有返回值应写为void

形参:逗号分隔的多个变量的说明形式

注意:在函数体中,表达式语句里使用的变量必须事先已有说明,否则不能使用。
return后面加表达式,语句中表达式的值,要和函数的<数据类型>保持一致。

总结函数的数据:

(1)没有参数:参数列表可以省略,也可以写成void。

(2)没有返回值:数据类型为void, 函数内部没有return语句。

(3)有返回值:要根据返回值的数据类型定义函数的数据类型

(4)定义子函数时可以直接定义在主函数上面,如果定义在主函数下面需要提前声明函数。

类型为void可以省略或者无表达式结果返回。(即写成return;)

3.函数调用

(1)没有返回值: 直接调用:函数名(实参);

(2)有返回值: 如果需要接收返回值,就要在函数内定义一个和返回值类型相同的变量用return 返回出去,如果不需要接收返回值,直接调用即可。

无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
如果定义在main函数下面,要先在main函数上面声明这个函数。

4.函数传参

(1)值传递

单向传递,将实参这个数据传递给形参使用,函数内改变形参函数外的实参不会受影响,因为他们是属于不同的空间。(把值复制一份传递过去,对复制的内容进行了修改,原内容不变)

(2)地址传递

双向传递,在函数内通过传递的地址修改地址所指空间中的内容,实参会随之变化。(把变量的地址传递过去,通过地址对原内容修改)

(3)数组传递

和地址传递一样,参数中存在地址,也就是指针。(本质也会认为是地址传递,传递的是数组的首地址(一维数组))

5.函数和栈区

(1)概念

栈用来存储函数内部的变量(包括main()函数)。由CPU自动管理,所以你不必手动申请和释放内存。内存由系统自动申请,在变量生命周期结束时由系统释放

(2)总结

栈由CPU管理,无法修改,变量自动地分配和释放,栈并非没有限制,大部分栈都有一个上边界,栈随着变量地产生和销毁生长和收缩,栈区变量只有在函数创建它们地时候存在

开辟堆区(heap)空间

1.堆区的概念

申请的空间种分为五个区域栈区(堆栈区),堆区,全局区,常量区,代码区,我们之前讲的这些定义变量、数组都是在内存的栈区存储。

2.堆区的特点

由我们程序员随时申请,由我们自己随时释放。

3.堆和栈的区别

(1)栈由系统自动分配,而堆是人为申请开辟;

(2)栈获得的空间较小,而堆获得的空间较大;

(3)栈由系统自动分配,速度较快,而堆一般速度比较慢;

(4)栈是连续的空间,而堆是不连续的空间是随机分配的。

malloc 函数

1.定义

#include <stdlib.h>

void *malloc(size_t size);

功能:在堆区开辟大小为size的空间

参数:size:开辟空间的大小(单位:字节)

返回值:

成功:返回开辟空间的首地址

失败:NULL;

malloc()要和free()搭配使用
size_t大小:printf("%d\n",sizeof(size_t)); //4字节

2 用法

malloc内的参数是需要动态分配的字节数,而不是可以存储的元素个数

存储的是字符型数据,每个元素1字节,所以字节数刚好等于需要存储的元素个数(字符数+1);

存储的是整型或浮点型数据,字节数等于需要存储的元素个数 * 一个元素的字节数

代码格式:

数据类型 *指针名 = (数据类型 *)malloc(n*sizeof(数据类型));

3. free()函数定义

#include <stdlib.h>

void free(void *ptr);

功能:释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。

参数:ptr:堆区空间首地址

返回值:无

可以释放完以后赋值为空指针

free(p); //p成为野指针

p=NULL; //防止使用野指针

注意:

1.手动开辟堆区空间,要注意内存泄漏,当指针指向开辟堆区空间后,又对指针重新赋值,则没有指针指向开辟的堆区空间,就会造成内存泄漏。

2.使用完堆区空间后及时释放空间

4.函数中开辟堆区空间

1.通过返回值

2.通过传参, 传递二级指针

string函数族

1.strcpy

#include <string.h>

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

功能:把整个字符串复制,包括\0。

参数: char *dest :目标字符串首地址

const char *src:源字符串首地址

返回值:目标字符串首地址

2.strcat

#include <string.h>

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

功能:用于字符串拼接

参数:char *dest:目标字符串首地址

const char *src: 源字符串首地址

返回值:目标字符串首地址

3.strlen

#include <string.h>

size_t strlen(const char *s);

功能:计算字符串长度

参数:s:字符串的首地址

返回值:返回字符串实际长度,不包括'\0'在内。

4.strcmp

#include <string.h>

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

功能:用于字符串比较

参数:s1 s2用于比较多字符串

返回值:从字符串首个字符开始比较字符ASCII的大小,如果相等继续向后判断。

正数: s1>s2

0 : s1== s2

负数: s1<s2

相关推荐
CoolTiger、1 小时前
【Vmware16安装教程】
linux·虚拟机·vmware16
jiao000011 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠1 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond1 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
学习3人组2 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神2 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0662 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
迷迭所归处2 小时前
C++ —— 关于vector
开发语言·c++·算法
geek_Chen012 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
架构文摘JGWZ3 小时前
Java 23 的12 个新特性!!
java·开发语言·学习