c语言基础

1、初识C语言

1.1、第一个C语言程序

#include <stdio.h>  //#include 引用头文件  stdio.h 标准输出与输入,凡是使用打印输出或者输入一定要引用stdio.h

int main(void)
{
    printf("你好,C");  //打印输出到屏幕上
    return 0;
}


#计算两数之和
#include <stdio.h> 
int main(void)
{
    int i1,i2,sum;
    i1 = 2;
    i2 = 3;
    sum=i1+i 2;
    printf("sum=%d\n",sum);
    return 0;
}
转义字符含义
\b退格,将当前位置移到前一列
\f换页,将当前位置移到下页开头
\n换行,将当前位置移到下一行开头
\r回车,将当前位置移到本行开头
\t水平制表,跳到下一个Tab位置
\v垂直制表
\\表示反斜杠本身(\)
\’表示单引号(')
\"表示双引号(")
\?表示问号(?)
\0表示空字符(NULL)
\ddd1~3位八进制数所代表的任意字符
\xhh1~2位十六进制数所代表的任意字符

1.2、变量与常量

变量常量
在c语言运行过程中,需要把值存储在一个地方,方便下次直接拿出来使用,并且可以随时修改。在c语言运行过程中,将值放入其中后,不能修改。
变量命名只能由英文字母(A-Z,a-z)、数字或者下划线组成。必须以英文字母或者下划线开头。区分大小写常量命名一般用大写英文字母
数据类型 变量名 = 初始值 如 int i = 1const 数据类型 常量名 = 值 const float PI=3.14
#define 常量名 值 #define PI 3.14
#include <stdio.h> 
#define PI 3.14
int main(void)
{
    int i1=2;
    /*
    const double PI = 3.14; */
    printf("PI=%lf",PI);
    return 0;

}

1.3、数据类型

在这里插入图片描述

1.4、关键字

autobreakcasecharconstcontinuedefaultdo
doubleelseenumexternfloatforgotoif
intlongregisterreturnshortsignedsizeofstatic
structswitchtypedefunionunsignedvoidvolatilewhile

2、分支与循环

2.1、分支结构

在这里插入图片描述

在程序运行过程中往往会遇到选择判断的,比如判断用户是否满18岁?

运算符含义优先级举例说明
!逻辑非!a如果a为真,!a为假
如果a为假,!a为真
&&逻辑与a&&b只要有一个为假,结果就为假
如果两个都为真,结果为真
||逻辑或a||b只要有一个为真,结果为真
如果两个都为假,结果为假

选择语句有if、switch

if运用于判断一个范围

#include <stdio.h> 
int main(void)
{
    int i;
    printf("你多少岁:");
    scanf("%d",&i);
    if (i >= 18) {
        printf("你是青年!");
    }
    else {
        printf("你是儿童");
    }
    return 0;
}

switch运用于判断一个确切的值

#include <stdio.h> 
int main(void)
{
    int i;
    printf("你多少岁:");
    scanf("%d",&i);
    switch (i) {
      case 20:
        printf("你是青年!");
        break;
      case 17:
        printf("你是不青年!");
        break;
      default:
          printf("什么都不是");
    }

    return 0;
}

2.2、循环结构

在这里插入图片描述

在程序运行过程中往往会去做一些重复的事情,这个时候就需要循环结构了。

循环语句有while、for

while运用于不知道要循环多少次的

#include <stdio.h> 
int main(void)
{
    int i=1,sum=0;
	while (i<=100)
	{
		sum = sum + i;
		i = i + 1;
	}
	printf("结果是:%d\n",sum);
    return 0;
}

for运用于知道循环的次数

#include <stdio.h> 
int main(void)
{
    

    for (int i = 0;i < 10;i++) {
        printf("jpl\n");
    }
    return 0;

}

3、数组

3.1、定义

数组用来存储同一类型的一组数据

3.2、使用

数组常与for循环语句结合使用

定义数组 :数据类型 数组名[长度] int a[6];

#include <stdio.h> 
int main(void)
{
    int a[] = {9,8,7,6,5,4,3,2,1,0};
    for (int i = 0;i < sizeof(a)/sizeof(int);i++) {
        printf("%d\n",a[i]);
    }
    return 0;
}

4、指针

4.1、定义

指针就是地址,变量存储在机器中的地址。

4.2、大小

在32位的机器上指针大小就是4个字节

在64位的机器上指针大小就是8个字节

4.3、使用

指针变量的定义

int *p;

指针数组的定义

int *a[6];

5、函数

5.1、定义

随着程序规模不断扩大,有一些代码重复、mian函数变得相当复杂,不易看懂。这个时候就需要我们去拆分main函数。按照功能将代码拆分出来,变成一个一个小模块。这些小模块就是函数

5.2、函数的分类

函数有官网给的函数,也有我们自己在写程序过程中定义的函数

//计算两数之和
#include <stdio.h> 

float cube(int x, int y) //函数的定义
{
    float result;
    result = x + y;
    return result;
}

int main(void)
{
    
    int x, y;
    int volume;
    printf("请输入x:\n");
    scanf("%d",&x);
    printf("请输入y:\n");
    scanf("%d", &y);
    volume = cube(x, y);
    printf("the volume of cube is:%d",volume);
    return 0;
}

5.3、形参与实参

函数定义时写的参数叫形参,实参就是调用函数时传进去的参数。当函数调用时,实参的值传给形参,形参只有函数被调用时才会分配内存,函数调用结束后,立即释放内存。

5.4、局部变量与全局变量

局部变量定义在函数内部的变量,只能在函数内部使用。

全局变量定义在函数之外的变量,在程序中可能多一个函数需要使用同一个变量,这个时候就可以定义全局变量

5.5、存储类型

auto自动变量,在代码块中声明的变量默认的存储类型
register寄存器变量,理论上是存放在CPU的寄存器中的,但因为一些原因,可能会被编辑器忽略,变成普通的自动变量。
static修饰局部变量:局部变量初始化一次,直到程序终止,才会被销毁。
修饰全局变量:被修饰的变量的作用域在当前文件中,直到程序终止,才会被销毁。
extem用于提供一个全局变量的引用,对所有程序文件可见。

5.6、内存管理

之前提到的定义变量、定义常量,其实就是向内存要一个存储空间,这个空间的大小必是由据储存类型来确定的。那么我想直接在内存要一个自定义的存储空间如何做呢?可以通过下面的方式来申请内存空间。

函数名作用
malloc申请动态内存空间
free释放动态内存空间
calloc申请并初始化一系列内存空间
realloc重新分配内存空间

使用以上四个函数时需要引用stdlib.h这个头文件

//这个程序的意思是  使用malloc申请一块空间,然后用ptr指针指向它,随后将用户输入的数据存储在这块空间里,
#include <stdio.h> 
#include<stdlib.h>
int main(void)
{
    int *ptr;
    //void *malloc(size);  
    ptr = (int *)malloc(4);//malloc如果调用成功,返回void指针,它可以转换成任意数据类型,如果调用失败,返回NULL。
    if (ptr == NULL)
    {
        printf("分配内存失败!\n");
        exit(1);
    }
    printf("请输入一个整数:\n");
    scanf("%d", ptr);
    printf("你输入的整数是:%d\n", *ptr);
    free(ptr);//释放ptr指向的内存空间
    return 0;
}

malloc申请的空间,在不使用后,一定要用free释放空间。

如果出现第一次申请的内存空间不够,后面在去申请内存空间就很麻烦,因为无法保障malloc两次申请的空间是连续的,处理起来很麻烦。这个时候可以用realloc

#include<stdlib.h>
int main(void)
{
  。。。。。。
  void *realloc(ptr,size);   //将ptr指向的内存空间大小修改为size字节 
}
#include<stdlib.h>
int main(void)
{
  。。。。。。
  void *calloc(num,size);   //申请内存空间大小为size字节num个 
}

5.7、内存布局

在这里插入图片描述

代码段
存放程序执行代码的一块区域
数据段
存放已经初始化的全局变量和局部静态变量
BBS段
存放程序中未初始化的全局变量

程序运行中被动态分配的内存区域,程序员手动申请。

函数执行的内存区域,系统自动分配

6、结构体

6.1、定义

前面说了几个基本类型,但有时候面临的问题比较复杂,基本类型很难解决问题,就需要自己定义一个类型,这就是结构体

6.2、声明

struct  结构体名字
{
    结构体成员1;
    结构体成员2;
    结构体成员4;
}
示例
struct  People
{
    char name[20];
    int age;
    char sex;
}

6.3、示例

#include <stdio.h> 
struct  People
{
    char name[20];
    int age;
    char sex;
};
int main(void)
{
    struct People people;
    printf("请输入姓名:\n");
    scanf("%s",people.name);
    printf("请输入年龄:\n");
    scanf("%d", &people.age);
    printf("请输入性别:\n");
    scanf("%s", &people.sex);

    printf("\n======录入完毕======\n\n");
    printf("名字:%s\n",people.name);
    printf("年龄:%d\n", people.age);
    printf("性别:%s\n", &people.sex);
    return 0;

}

7、文件操作

7.1、文件的读写

7.1.1文件的打开模式
模式描述
“r”以只读模式打开一个文本文件,从头开始读取
“w”以只写模式打开一个文本文件,从头开始写入,如果文件不存在则创建一个文件,如果文件存在,则写入内容覆盖原内容
“a”以追加模式打开一个文本文件,从文件末尾追加内容,如果文件不存在,则创建新文件
“r+”以读和写的模式打开一个文本文件,从文件头开始读取与写入,文件必须存在,写入时不会覆盖原有内容
“w+”以读和写的模式打开一个文本文件,从文件头开始读取与写入,如果文件不存在,则创建新文件,写入时会覆盖原有内容
“a+”以追加和读模式打开一个文本文件,如果文件不存在,则创建新文件,从头开始读取,从文件末尾追加内容
b与上面6种模式均可结合(“rb”,“wb”,“ab”,“r+b”,“w+b”,“a+b”),操作对象为二进制文件(图片、视频等)

普通文件在win系统上换行符为\r\n,unix(linux)换行符为\n,mac换行符为\r

//以只读的形式打开文件,并读取文件内容
#include <stdio.h> 
#include<stdlib.h>
int main(void)
{

    FILE* fp;
    int ch;
    if ((fp = fopen("D:\\1.txt", "r")) == NULL)
    {
        printf("打开文件失败!\n");
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(fp)) != EOF) 
    {
        putchar(ch);
    }
    fclose(fp);
    return 0;

}
//向文件写入内容
#include <stdio.h> 
#include<stdlib.h>
int main(void)
{

    FILE* fp;
    int ch;
    if ((fp = fopen("D:\\1.txt", "w")) == NULL)
    {
        printf("打开文件失败!\n");
        exit(EXIT_FAILURE);
    }
    fputs("jpl\n",fp);
    fclose(fp);
    return 0;

}

7.2、I/O缓存区

文件并不是程序直接从设备中读取与写入的,他们中间有一个缓存区,读取与写入的数据会经过缓存区。当缓存区关闭或者写满时。数据才会到达设备或者程序

7.2.1、缓存模式

缓存区有两种模式:1、按数据块缓存,即填满缓存区才会进行实际的设备书写。2、按行缓存,即缓存区读取到换行符(‘\n’),就开始实际设备的读写。

8、Linux上运行c程

由于企业中c语言开发大多是在Linux上调式与运行的,在这里简单介绍一下,如何在Linux环境中运行c程序。Linux的内核基本上是有c语言编写的,c语言在Linux中很大的发挥空间。
我的linux版本为centos7
首先检查一下,系统上有没有gcc(c语言的编辑器)

//查看gcc信息
gcc -version
//安装gcc
yum -y install  gcc  gcc-c++  kernel-devel

编写程序
运行c语言程序

gcc  文件名.c  && ./a.out

在这里插入图片描述

由于c语言是直接运行在机器上的,所以操作系统对c语言的影响会比较大。在linux上运行的结果可能与在win上运行的结果有所偏差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳关的美好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值