初识C语言,从0开始,笑着笑着就入门了(万字文章)

      🐰作者简介:一位普通高校的在校学生,致力于提高自己的编程能力。

      🍌个人主页:比昨天强一點的博客_CSDN博客-领域博主

      🍍系列专栏:C语言从0到精通_比昨天强一點的博客-CSDN博客

      🏷️学习格言:无人问津的日子,最是提高自己的好时机。

目录

1.什么是C语言

2.第一个C语言程序

3.数据类型

3.变量和常量

3.1定义变量的方法

3.2变量的命名

3.3 变量的分类

3.4变量的使用

3.4 变量的作用域和生命周期

3.5常量

4. 字符串+转义字符+注释

4.1 字符串

4.2转义字符

5. 注释

6. 选择语句

7.循环语句

8.函数

9.数组

9.1 数组定义

9.2 数组的下标

9.3 数组的使用 

10. 操作符(简单介绍几个,后续进阶会讲,主要怕你们从入门到放弃啊​编辑)

11. 常见关键字

11.1 关键字 typedef

11.2关键字static

11.2.1 修饰局部变量

11.2.2 修饰全局变量

11.2.3 修饰函数

12. #define 定义常量和宏 

13. 指针

13.1 内存

13.2 指针变量的大小

14. 结构体


        本章目的:希望你能通过这篇文章基本了解C语言,但是不会太深入讲解,C语言进阶将会在本专栏后续文章中。

1.什么是C语言

        语言,顾名思义,应该是用来沟通的,对话的,人与人之间沟通,有用中文、英文等等。而C语言是什么呢,C语言其实是程序员与计算机进行沟通而使用的语言之一。

         C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语

        尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

        二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

        C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。 其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C、Clion等,苹、果系统有Xcode等。

      


2.第一个C语言程序

        首先欢迎各位新人正式开始成为一位程序猿()

那么我们来打印输出一个Hello World!(只会Hello World!)

#include <stdio.h>


int main(){


    printf("Hello World!");
    
    return 0;
}

//#include <stdio.h> 是头文件
//main是主函数,也是程序的入口,
//一个工程中,main函数有且只有一个

        这段代码运行会将Hello World!打印在屏幕上(如图)

 是不是很惊喜


3.数据类型

C语言中有七大数据类型

1.char           //字符数据类型

2.short          //短整形        

3.int              //整形

4.long           //长整形

5.long long   //更长的整形

6.float           //单精度浮点型

7.double       //双精度浮点型

为什么有这么多种数据类型呢?

答:是为了能够丰富的表达生活中的各种值

每种类型的大小是多少?(多少个字节)

//以32位操作系统为例
#include <stdio.h>
int main(){

    printf("%d\n", sizeof(int));           //4
    printf("%d\n", sizeof(char));          //1
    printf("%d\n", sizeof(short));         //2
    printf("%d\n", sizeof(double));        //8
    printf("%d\n", sizeof(float));         //4
    printf("%d\n", sizeof(long long));     //8
    printf("%d\n", sizeof(long));          //4 但在64位操作系统占8个字节
    printf("%d\n", sizeof(long double));   //8

    return 0;
}

数据类型如何使用呢?(举几个栗子🌰)

char ch = 'a';

int height = 180;

double wage = 58888.0;  //这就是大家的月薪🌹

3.变量和常量

        生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)有些值是可变的(比如:年龄,体重,薪资)不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

3.1定义变量的方法

int age = 18;
float weight = 45.5f;
char ch = 'w';

3.2变量的命名

  • 只能由字母(包括大写和小写)、数字和下划线( _ )组成。
  • 不能以数字开头。
  • 长度不能超过63个字符。
  • 变量名中区分大小写的。
  • 变量名不能使用关键字。

3.3 变量的分类

  • 局部变量
  • 全局变量
     
#include <stdio.h>

    
int global = 20; //全局变量

int main(){

    int local = 10; //局部变量
    int global = 30; //局部变量(可以与全局变量重名,但是不推荐)

    printf("%d\n",global); //打印30,当局部变量与全局变量名一致时,采用局部优先原则。

    return 0; 

}

3.4变量的使用

#include <stdio.h>

int mian(){

    int num1 = 0; 
    int num2 = 0;  
    int sum = 0;  //定义变量并初始化值0

    scanf("%d%d",&num1,&num2);//这是输入函数,可以在运行时自行输入num1,num2的值

    sum = num1 + num2; //变量之间可以进行各种数学运算。
    
    printf("%d\n",sum); //假设输入num1为10,num2为20,则输出30。
    
    return 0;

}

3.4 变量的作用域和生命周期

作用域:

        作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个梗名字的作用域

  • 局部变量的作用域是变量所在的局部范围。
  •  全局变量的作用域是整个工程。

生命周期:

        变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段(或者说变量从创建到销毁中间的过程就是变量的整个生命周期)

  • 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
  • 全局变量的生命周期是:整个程序的生命周期。

3.5常量

C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:

  • 字面常量
  • 枚举常量
  • #define 定义的标识符常量
  • const 修饰的常变量

我们一一举栗🌰

#include <stdio.h>

//栗子🌰

enmu Sex{

    MALE,    //默认值是0
    FEMALE,  //1
    UNKNOWN  //2

};

//括号中的MALE,FEMALE,UNKNOWN是枚举常量


//define定义的常量
#define MAX 100 

int main(){

    3.14 //字面常量

    //const修饰的常变量
    const float pie = 3.14f;//这是const修饰的常变量,不能直接修改,但是可以通过指针变量修改(后续会讲,这里不多赘述)



}

4. 字符串+转义字符+注释

4.1 字符串

"Hello World!"

        这种由双引号,引起来的就是字符串,字符串的结束标志是一个\0转译字符,在计算字符串长度时\0是结束标志,不算做字符串内容。

#include <stdio.h>


int main(){


    char arr1[] = "Hello";
    char arr2[] = {'H','e','l','l','o'};
    char arr3[] = {'H','e','l','l','o','\0'};


    printf("%s\n",arr1);//输出 Hello
    printf("%s\n",arr2);  输出 乱码(因为没有\0作为结束标志)
    printf("%s\n",arr3);  输出 Hello

    return 0;

}

4.2转义字符

假设我们要在屏幕上打印一个目录: c:\code\test.c

      如下,如果我们这样写代码。

#include <stdio.h>

int main(){

    printf("c:\code\test.c");

    return 0;
}

 当我以为我的代码没问题时..........等等

他居然输出了这样一串

 

这是为什么呢?😭

        这里就不得不提一下转义字符了。转义字符顾名思义就是转变意思。

下面看一些转义字符。

转义字符释义
\?

在书写连续多个问号时使用,防止他们被解析成三字母词

\'

用于表示字符常量'

\"

用于表示一个字符串内部的双引号

\a

警告字符,蜂鸣

\b

退格符

\f进纸符
\n换行符
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1-3个八进制数 如:\130
\xdddd表示1-2个十六进制数 如:\x5a
\\用于表示一个反斜杠,防止它被解释为一个转义序列符。

5. 注释

  • 1. 代码中有不需要的代码可以直接删除,也可以注释掉
  • 2. 代码中有些代码比较难懂,可以加一下注释文字

举几个栗子🌰

#include <stdio.h>




int mian(){

    int num1 = 10;
    int num2 = 20;
    int sum = 0;
    /* C语言注释风格
    int num1 = 10;
    int num2 = 20;
    */

    
    sum = num1 + sum2; //两数相加。C++注释风格

}

6. 选择语句

        如果你好好学习,校招时拿一个好offer,赢取白富美,走上人生巅峰。 如果你不学习,毕业等于失业,工地搬砖。 这就是选择!(你看他笑的多开心())

 来看一段代码,你就知道if-else如何使用了

#include <stdio.h>

int main(){


    int choose = 0;

    printf("你会去敲代码吗?选择1 or 0");

    scanf("%d",&choose);

    if(choose == 1){
        printf("老铁,你会有好offer的,我看好你呦\n");
        
    }else{
        printf("早点卷铺盖回家走人,搬砖去吧");
    
    }

    return 0;


}

7.循环语句

        有些事必须一直做,比如每天都要吃饭,都要睡觉,日复一日,年复一年。

还比如:

 

 C语言循环语句有三种

  • for
  • while
  • do...while

    先看代码    

#include <stdio.h>

int mian(){

    int line = 0;


    //for循环演示
    for(line = 0; line <= 20000;line++){

        printf("我要继续努力敲代码\n");
    
    }

    if(line>20000){

        printf("好offer\n");

    }


    //while循环演示
    while(line <= 20000) {
        line++;
        printf("我要继续努力敲代码\n");
    }

    if(line>20000){

        printf("好offer\n");

    }


    //do...while循环演示
    do{
        line++;
        printf("我要继续努力敲代码\n");
    
    }while(line <= 20000);
    
    if(line>20000){

        printf("好offer\n");

    }

    return 0;    

}

总结三种循环的判断方式:举个栗子🌰, 你有一个女朋友,前两种循环呢是先判断她是不是你女朋友,是:干羞羞的事情。   不是:走人。那么do....while循环呢是先干羞羞的事情再判断是不是你女朋友(手动dog)是:接着干。不是:赶紧穿上裤子跑路。


8.函数

        函数的作用就是将反复使用的代码片段独立出去,这样可以通过调用函数来执行这些代码,可以简化代码,提高代码复用性。

        栗子🌰

#include <stdio.h>



int add(int a, int b){  //int 是函数的返回类型,通过实际需求自行设计,小括号里的是参数,将想要进行求和的数传进函数来

    int sum = 0;

    sum = a + b;

    return sum;    //返回值,需要对应函数的返回类型
}


int main(){


    int num1 = 10;

    int num2 = 20;

    int sum = 0;

    sum = add(num1, num2);
    
    printf("num1 + num2 = %d\n",sum);

    return 0;

    
}

9.数组

        假如我们要存储10数据,怎么办呢!

        有同学说,我们可以定义十次。(int sum1; int sum2;int sum3........)(嗯,可行)但是如果我们要存储一万个数据呢(你要不要看看你在说什么???),这个时候就要用到数组了。

9.1 数组定义

int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个整形数组,最多放十个元素,arr是数组名,可自行选择(但要遵循变量名命名规则,3.2中讲过)

9.2 数组的下标

  • 数组的下标是从0开始的
  • 数组可以通过下标来访问的。

比如:

int arr[10] = {0}; // 全部初始化为0

9.3 数组的使用 

#include <stdio.h>


int main(){

    int arr[10] = {1,2,3,4,5,6,7,8,9,10};

    for(int i = 0;i < 10; i++){


        printf("%d ",arr[i]);    
    }
    
    printf("\n");
    return 0;
}

运行结果如下:


10. 操作符(简单介绍几个,后续进阶会讲,主要怕你们从入门到放弃啊

        算术操作符

+

-

*  乘法

/  除法

% 取模/取余数    比如   5%2     这个表达式结果是1

        移位操作符

>>        <<

        位操作符

&     ^     |

        赋值操作符

=     +=    -=   *=   /=   &=    ^=    |=    >>=    <<=

        单目操作符

! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)

~ 对一个数的二进制按位取反

-- 前置、后置--     
++ 前置、后置++     比如:a++ 或者 ++a  那么a的值就在原来基础上+1  
* 间接访问操作符(解引用操作符)

(类型) 强制类型转换

        关系操作符

> 大于

>= 大于等于

< 小于

<= 小于等于

!= 不等于

== 相等

        逻辑操作符

&&  逻辑与    如: exp1 && exp2    两边都为真才为真

||     逻辑或    如: exp1 && exp2    两边有一个真就为真

        条件操作符

exp1? exp2 : exp3

        逗号表达式

exp1,exp2,exp3....expn

        下标引用、函数调用和结构成。

[ ]     ()      .      ->


11. 常见关键字

        C90标准中,有32个关键字,分别是 (这么多 )(不要害怕!)

auto double int struct break  else  long  switch  case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static 

        C99中37个,新增5个

inline 内联函数           restrict 用于限定指针        _Bool  定义布尔类型变量(1真0假)         _Complex  定义复数类型             _Imaginary 定义虚数类型

        C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。

        注:关键字,先介绍下面几个,后期遇到讲解。

11.1 关键字 typedef

typedef顾名思义就是类型定义,这里可以理解为类型重命名

        看栗子🌰

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名 

typedef unsigned int uint_32;

int main(){

    //观察num1和num2,这两个变量的类型是一样的 
    unsigned int num1 = 0;
    uint_32 num2 = 0;

    return 0;
}

11.2关键字static

在C语言中: static是用来修饰变量和函数的

1. 修饰局部变量-称为静态局部变量

2. 修饰全局变量-称为静态全局变量

3. 修饰函数-称为静态函数

11.2.1 修饰局部变量

//代码一
#include <stdio.h>

void test(){

    int i = 0;
    i++;
    printf("%d ",i);

}

int main(){


    for(int k = 0; k< 10; k++){

        test();

    }
    return 0;
}


//代码二

#include <stdio.h>

void test(){

    static int i = 0;
    i++;

    printf("%d ",i);

}

int main(){


    for(int k = 0; k< 10; k++){

        test();

    }

    return 0;
}

//代码一输出 1 1 1 1 1 1 1 1 1 1
//代码二输出 1 2 3 4 5 6 7 8 9 10

//代码三 如果我们在主函数内是有 i行不行呢

#include <stdio.h>

void test(){

    static int i = 0;
    i++;

    printf("%d ",i);

}

int main(){


    for(int k = 0; k< 10; k++){

        test();

    }
    
    printf("%d\n",i); //这是不行的,i的作用域依然是局部的智能在test函数内部使用

    return 0;
}

        对比代码1和代码2的效果理解static修饰局部变量的意义。

结论:

        static修饰局部变量,只定义一次。 并且出代码块也不会被释放。(所以修饰局部变量,相当于将该局部变量生命周期变为整个工程期间,但是作用域不变。依然只能在代码块内使用)

11.2.2 修饰全局变量

//代码一

文件add.c

int g_val = 10;

文件test.c

#include <stdio.h>

int main(){

    printf("%d\n",g_val); //可行

}


//代码二

文件add.c

static int g_val = 10;

文件test.c

#include <stdio.h>

int main(){

    printf("%d\n",g_val); //不可行

}

        代码1正常,代码2在编译的时候会出现连接性错误。

结论:

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

11.2.3 修饰函数

//代码一

文件add.c

int add(int a, int b){

    return a + b;
}

文件test.c

#include <stdio.h>

int main(){

    printf("%d\n",add(5,8)) //可行

}


//代码二

文件add.c

static int add(int a, int b){

    return a + b;
}

文件test.c

#include <stdio.h>

int main(){

    printf("%d\n",add(5,8)) //不可行

}

        代码1正常,代码2在编译的时候会出现连接性错误.

结论:

函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

        其他关键字后续C语言进阶讲


12. #define 定义常量和宏 

 先看栗子🌰

//define 定义标识符常量

#define MAX 1000 //MAX是常量名  1000是值(注意语句后不要加 ; 因为看到很多初学者加 ; 特意提一句)

//define定义宏

#define ADD(x, y) ((x) + (y))

#include <stdio.h>

int main(){

    int arr[MAX] = {0}; // 这是可行的,因为MAX是常量

    int sum = ADD(2,3);
    printf("sum = %d\n",sum); // 打印5

    sum = 10 * ADD(2,3);
    printf("sum = %d\n",sum); // 打印50

    return 0;
}

13. 指针

13.1 内存

        内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

        看图:

         所有变量本质都是要在内存的某个位置开辟空间的!(每个内存单元都有地址,所以变量也是有地址的)假设我们定义一个int型 变量a。

取出变量地址如下:

#include <stdio.h>

int mian(){

    int a = 0;

    &a; //这就是将a的地址取出来 ,int的大小是4个字节,取地址只取首个字节的地址

    printf("%p\n",&a); //%p 是以地址的形式打印

    return 0;

}

那么地址如何存储呢?(这个时候我们就需要指针变量)

int a = 10;

int *p; //p为一个整形指针变量

p = &a;

指针使用栗子🌰

int a =10;

int *p;

p = &a;

*p = 20; //这里将a的值改为20

以整形指针举例,可以推广到其他类型,如:

#include <stdio.h>

int main(){

        char ch = 'a';

        char * p = &ch;

        *p = 'q';  //将char型变量 ch的值改为q

        return 0;

}

13.2 指针变量的大小

//指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节)
#include <stdio.h>

int main() {
    printf("%d\n", sizeof(char *));    4/8
    printf("%d\n", sizeof(short *));   4/8
    printf("%d\n", sizeof(int *));     4/8
    printf("%d\n", sizeof(double *));  4/8
    return 0;
}

        结论:指针大小在32位平台是4个字节,64位平台是8个字节。 


14. 结构体

        结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。这里只能使用结构体来描述了。

例如:

struct Stu{

        char name[20];  // 姓名

        int age;              //年龄          

        char sex[5];       //性别 

        char id[20];        //学号

};

结构体的初始化 ,看代码

#include <stdio.h>


struct Stu{

     char name[20];  // 姓名

     int age;              //年龄          

     char sex[5];       //性别 

     char id[20];        //学号

};


int main(){

    //结构体变量的定义及初始化
    struct Stu s = {"蔡徐坤",20,男,"20221018"};

    //打印结构体变量成员     .为结构体成员访问操作符
    printf("姓名:%s\n 年龄:%d\n 性别:%s\n 学号:%s\n",s.name,s.age,s.sex,s.id);


    //结构体指针

    struct Stu *ps = &s;
    //-> 操作符
    printf("姓名:%s\n 年龄:%d\n 性别:%s\n 学号:%s\n",ps->name,ps->age,ps->sex,ps->id);





}

         🎬如果你刚步入计算机世界,并且认真看到这里,那么希望本文能对你有所帮助,如果你觉得文章不错的话,可以关注博主,博主后续会不断更新更优质的文章来分享博主的学习心得,也希望能够让在编程路上遇到困难的小伙伴获得一些帮助。

评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

比昨天强一點

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

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

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

打赏作者

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

抵扣说明:

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

余额充值