C语言入门笔记 —— 初识

很多新入门的小伙伴都想要深入学习C语言,但因为是刚刚接触,大多对C语言没有整体上的认知,因此很容易会在前期钻入牛角尖,耗费大量时间精力,到头来却是“竹篮打水一场空”、“捡了芝麻丢了西瓜”。因此小编在这里为刚接触C语言的同学们准备了一份C语言入门级笔记(包含概括总结),帮助同学们粗略地建立C语言的整体认知。

码字不易,别忘了先赞后看哦!

看完本篇文章,你将会对C语言基础和常识、运行第一个C语言程序、数据类型、变量和常量、字符串、转义字符、注释方法、选择语句、循环语句、函数、数组、操作符、常见关键字、计算机的储存结构和内存分布、宏、指针、结构体有初步的了解。

本篇文章由概念、代码、题目结合的方式组成


目录

1.C语言基础和常识

1.1 计算机是一门编程语言

1.2 多应用于底层开发

1.3 ANSI(美国国家标注局制定的C语言标准)

1.4 git

2.运行第一个C语言程序

2.1 编译器

2.2 第一个C语言程序

3.数据类型

3.1  数据类型

3.2  计算机储存大小衡量单位 

3.3 计算字符大小的方法

4.变量

 4.1定义变量的方法

4.2 变量的分类

4.3 变量的使用

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

*作用域,代码的可用范围就是作用域

*生命周期 

5.常量

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

*字符串

*转义字符(简略版)

*注释

 7.选择语句

if...else语句

 *switch语句

8.循环语句

*while循环

*for循环

*do while循环 

*多重循环(略)

9.函数

10.数组 

10.1数组定义

10.2数组的下标

10.3数组的使用

         10.4 初始化、赋值

11.操作符

11.1 操作符

11.2 补充(测试,逗号)

12.常见关键字(C语言的关键字不能自己创造) 

*关键字

*static修饰局部变量 

*储存结构

*内存分布 

13.#define定义常量 (定义的变量如MAX要用大写) 

14.指针 

14.1内存

14.2 一些细节

15.结构体(集中属性,结合来描述某一/几件事物) 

16.结语 


1.C语言基础和常识

1.1 计算机是一门编程语言

计算机是一门编程语言,同时是一门高级语言。计算机语言是由低级语言逐渐演变成高级语言的。

低级语言(二进制机器语言)——>汇编语言(使用类似于add的助记符组成)——>B语言、C语言

1.2 多应用于底层开发

C语言多应用于底层开发,那有很多小伙伴会问了什么叫底层开发呢?其实计算机是如下图自上而下组成

应用软件

操作系统(win/linux)[在操作系统之下的即为底层啦,但注意C语言也可以开发应用软件哦]

驱动软件

电脑——硬件

1.3 ANSI(美国国家标注局制定的C语言标准)

*C89、C99是使用最广泛的C语言标准哦!

*同类还有C99 ...... C11、C17;

1.4 git

知识点1:git是什么?
答:是一个版本管理工具。可以通过git工具上传自己的代码到代码托管网站,例如GitHub、gitee(提交之后可以通过show log查看修改日志)
知识2:linux操作系统
答:国外常用于学术上、科研上、教学。


2.运行第一个C语言程序

2.1 编译器

首先,我们需要有一个属于自己的编译器才能编译运行自己的代码,这里小编用的是vs2022;

vs2022是一个集成开发环境

集成开发环境 = 编辑器 + 编译器 + 调试器

2.2 第一个C语言程序

#include
int main ()
{
    printf ( "hello world\n" );
    printf ( "he he\n" );
    return 0 ;
}
// 解释:
//main 函数是程序的入口
// 一个工程中 main 函数有且仅有一个

 点击ctrl+F5,你的程序将会运行起来。 

 


3.数据类型

问题引入:什么是计算机语言?答:人和计算机交流的语言。

因此计算机语言必须能描述问题,所以创造了数据类型去表示不同事物。

3.1  数据类型

char         // 字符数据类型
short       // 短整型
int         // 整形
long         // 长整型
long long   // 更长的整形
float       // 单精度浮点数
double       // 双精度浮点数

3.2  计算机储存大小衡量单位 

bit - 比特位        
byte - 字节 =8bit        
KB    -1024        
MB    -1024
GB    -1024
TB    -1024
PB    ...
.....

3.3 计算字符大小的方法

#include

*int main()    //单位-字节
{
    printf("%d",sizeof(char));    //
sizoef用于计算字节
    return 0;
}

char        1bit(这是他们存储的大小,储存后边小编会讲到哦)
 short        2
 int        4
 long        4
 long long    8
 float        4
 double        8
  

3.4类型的使用 

char ch = 'w' ;
int weight = 120 ;

 


4.变量

 4.1定义变量的方法

定义变量的方法
int age = 10      //类型(int)+名字(age)

4.2 变量的分类

#include
int global = 2019 ;         // 全局变量
int main ()
{
    int local = 2018 ;         // 局部变量
    // 下面定义的 global 会不会有问题?
    int global = 2020 ;         // 局部变量
    printf ( "global = %d\n" , global );
    return 0 ;
}

*局部变量和全局变量名字冲突的情况下,局部优先

4.3 变量的使用

*计算两个数的和

#include
int main ()
{
    int num1 = 0 ;
  int num2 = 0 ;
    int sum = 0 ;
    printf ( " 输入两个操作数 :>" );
    scanf ( "%d %d" , & num1 , & num2 );
    sum = num1 + num2 ;
    printf ( "sum = %d\n" , sum );
    return 0 ;
}
// 这里介绍一下输入,输出语句
//scanf
//printf

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

*作用域,代码的可用范围就是作用域

  局部变量的作用域 - 括号内
  全局变量的作用域 - 整个工程(即不同源文件的变量也可以相互使用)
  extern - 用来声明外部符号(用于全局变量)

*生命周期 

  *局部变量的生命周期:进去作用域生命周期开始,出去即结束
  *全局变量的生命周期:整个程序的生命周期

 


 5.常量

#include
#define M 100        //3.#difine 定义的标识符常量 - 后面会讲到
{
    20;        //1.字面常量
    int a = 10;    //常见字面常量
            //2.const修饰的常变量
            //const是C语言的一个关键字,是常属性的意思
    int num = 10;    //可以被修改
    const int num = 10;    //不可以被修改,赋予了常属性,num本质上还是一个变量,不能用来指定数组大小
    return 0;
}


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

*字符串

字符串类型? - C语言没有
hehe world” - 但是可以表示字符串
char arr1[] = "a b c"        //a b c \0四个元素,字符串结尾隐藏着一个“ \0 ”
char arr2[] = ("a", "b", "c");    //输出之后,abc后会有随机值,读到\0停止

*转义字符(简略版)

\?
在书写连续多个问号时使用,防止他们被解析成三字母词
%d 整形
%s 打印字符串
%s 打印字符
\ddd \后跟三个八进制数
\130 代表把130这个八进制数字转化成十进制数字所对应的ascii码值对应的字符,即X
\xdd dd代表一个16进制的数

*注释

注释后的代码不会被计算机识别,常见注释方法有 “//”和“/*......*/”,多用第一种

*注释-快捷键

ctrl+k+c         注释
ctrl+k+u         取消注释 


 7.选择语句

if...else语句

题目:输入三个数,判断这三个数大小是否相等

#include

int main(void)
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);//"scanf"是“输入”的意思,&可以理解为取一个地址
    if (a == b && a == c)
        printf("三个值相等");
    else if (a == b || a== c || b==c)
        printf("两个值相等");
    else
        printf("三个值不相等");
    return 0;
}

 *switch语句

题目:输入一个月份,判断它的季节

#include

int main(void)
{
    int a;
    scanf("%d", &a);
    switch (a) {
    case 3: printf("%d月是春季\n", a);    break;                //case后的数字必须为常数结果,而不可以是变量
    case 4: printf("%d月是春季\n", a);    break;                //break是退出的意思
    case 5: printf("%d月是春季\n", a);    break;
        case 6: printf("%d月是夏季\n", a); break;
        case 7: printf("%d月是夏季\n", a); break;
        case 8: printf("%d月是夏季\n", a); break;
            case 9: printf("%d月是秋季\n", a); break;
            case 10: printf("%d月是秋季\n", a); break;
            case 11: printf("%d月是秋季\n", a); break;
                case 12: printf("%d月是冬季\n", a); break;
                case 1: printf("%d月是冬季\n", a); break;
                case 2: printf("%d月是冬季\n", a); break;
                default:printf("%d月不存在",a);                //default-可以理解为除此之外
    }
    return 0;
}


8.循环语句

*while循环

题目:逆向显示输入的数值

#include

int main(void)
{
    int a;
    scanf("%d", &a);
    printf("请输入一个正整数:");
    while (a > 0)

    {
        printf("%d ",  a % 10);       //逆向显示整数值,如1234-->4321
        a /= 10;
    }
    return 0;

*for循环

题目:计算1-n的和

计算1-n的和

#include

int main(void)
{
    int a, i, sum;
    sum = 0;
    printf("n的值是:");    scanf("%d", &a);
    for (i = 1; a >= i; i++)

    {                            //要用>=,把输入的数也算在里面
        sum += i;
    }
    printf("1到%d的和为%d", a, sum);
    return 0;
}

*do while循环 

问题:判断输入数是否为正数

#include
int main(void)
{
    int a,b;
    do {
        puts("请输入一个整数:");
        scanf("%d", &a);
        if (a == 0)
            puts("您输入的整数是0");
        else if (a > 0)
            puts("您输入的是正数");
        else
            puts("您输入的是负数");
        printf("要重复一遍吗,yes请按0,no请按9:");
            scanf("%d", &b);
    } while (b == 0);
    return 0;

*多重循环(略)

int iq  = 0;
while(scanf("%d",&iq) != EOF)
{
    if(iq >= 140)
    printf("");
}


9.函数

#include
int main ()
{
    int num1 = 0 ;
  int num2 = 0 ;
    int sum = 0 ;
    printf ( " 输入两个操作数 :>" );
    scanf ( "%d %d" , & num1 , & num2 );
    sum = num1 + num2 ;
    printf ( "sum = %d\n" , sum );
    return 0 ;
}
上述代码,写成函数如下:
#include
int Add ( int x , int y )
{
  int z = x + y ;
  return z ;
}
int main ()
{
    int num1 = 0 ;
  int num2 = 0 ;
    int sum = 0 ;
    printf ( " 输入两个操作数 :>" );
    scanf ( "%d %d" , & num1 , & num2 );
    sum = Add ( num1 , num2 );
    printf ( "sum = %d\n" , sum );
    return 0 ;
}

 


10.数组 

10.1数组定义

*数组 - 能够存放一组相同类型的元素

*int arr[10] = {1,2,3,4}    //初始化的数<=10,后面的元素默认为0

10.2数组的下标

*下标               0,1,2,3    //数组默认有下标
printf("%d\n",arr[3]);    //会打印出4,3为下标

10.3数组的使用

#include
int main ()
{
int i = 0 ;
int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
for ( i = 0 ; i < 10 ; i ++ )
{
      printf ( "%d " , arr [ i ]);
}
printf ( "\n" );
    return 0 ;
}

10.4 初始化、赋值

int a = 20;//初识化
a = 20;//赋值
a += a;//复合赋值运算符


11.操作符

11.1 操作符

*算数操作符 - %
*移位操作符
*位操作符  >>,<<
*位操作符 &,^, |

*单目操作符
1. +-*/       ——运算符
2.  ! —— 逻辑反操作符
3.  sizeof - 计算操作数的大小(字节)- 操作符
    int a = 10;
    printf("%d",sizeof(a))= printf("%d",sizeof(int)); 
4.  前置++,先++,后使用 —— ++a
     后置++,先使用,后++ —— a++
5.  前置--,
     后置--,
6.强制类型转换
    int a= (int) 3.14;
    printf("%d",a); 

*关系操作符
 >
<
>=
<=
==
int a = 0;
if(a = 5)    //有bug,建议改成 5==a,能避免bug
{
    printf("hehe\n");    //会打印hehe
    return 0;

&&并且
||或者 

*条件操作符(三目操作符)
a : b ? c
int a = 3;
int b = 5;
int m = 0;
//求较大值
m = (a > b) ? (a) : (b); 

*下标引用操作符
int arr[10] = {0};
arr[5] = 9;        // [ ] -  下标引用操作符

*函数调用操作符
int m = get_max(3,5);        // () - 函数调用操作符 

11.2 补充(测试,逗号)

*测试代码运行时间
调试开始——F10/Fn+F10
转到反汇编

*逗号表达式
有逗号隔开的表达式,表达式会从左到右依次计算,但是整个表达式的结果是最后一个表达式的结果 


12.常见关键字(C语言的关键字不能自己创造) 

*关键字

*auto
 register - 寄存器
 static - 静态的

*switch - case - default

*if - else

*循环
 for
 while
 do while
 - break - contine

*类型关键字
 void - 空
 char
 short
 int 
 long
 float
 double

*常变量
 const

*enum - 枚举关键字
*struct - 自定义类型 - 结构体
*union - 联合体

*extern - 声明外部符号

*return - 返回函数
*signed - 有符号的
*unsigned - 无符号
*sizeof - 计算大小

*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; } 

*register - 寄存器关键字
register int num2 = 20;//建议将20放在寄存器中 

*static修饰局部变量 


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


1. 修饰局部变量-称为静态局部变量 (static int a=5,static修饰的变量会储存在静态区,变量不会因为离开作用域而改变,生命周期仍在)

2. 修饰全局变量-称为静态全局变量(一个全局变量本来具有外部链接属性,但是被static修饰后,外部连接属性就变成了内部连接属性,只能在创建变量的源文件使用;)
 - 全局变量在大括号以外
 - extern 声明某变量来自外部符号(函数-来自于本/另源文件)
 - 要在解决方案中点击某个源文件进入,就会运行哪个函数的代码
 - 代码运行(编译+链接+执行)

3. 修饰函数-称为静态函数
 - 一个函数本来具有外部链接属性,但是被static修饰后,外部连接属性就变成了内部连接属性,只能在创建变量的源文件使用;
   使用上感觉作用域变小了
 

*储存结构

 寄存器(寄存到CPU上)       速度快、造价高,空间小
           高级缓存                       速度自上而下逐渐减慢、造价逐渐降低、空间逐渐增大
              内存
              硬盘
              网盘

*内存分布 

-栈区 - 局部变量、形式参数
(局部变量、函数的参数)

-堆区 - 动态内存分配
(动态内存开辟的malloc,realloc,calloc,free)

-静态区 - 静态变量、全局变量 - 静态区中的数据的生命周期和程序的生命周期一致
  (static int a=5,static修饰的变量会储存在静态区,变量不会因为离开作用域而改变,生命周期仍在)

13.#define定义常量 (定义的变量如MAX要用大写) 

#define MAX 1000
int main()
{
    int MAX;
    printf("%d\n",m);
    return 0;
}

*test.c (程序运行)- 预编译 - 编译 - 汇编 - 链接 - 运行
 预处理会用赋值替换变量,如上代码MAX会被替换成1000;

*求较大值

#define     MAX(x,y) ((x) > (y) ? (x) : (y))-用括号增加准确度
int m = MAX(a,b);
printf("%d\n",m);

14.指针 

14.1内存

*内存是重要的存储器,计算机程序是在内存中运行的

*为了更好使用内存,设计了内存单元,内存单元都有编号,这个编号就是地址,我们把这个地址叫指针

* 一个内存单元是多大? - 一个内存单元是1字节

*内存单元的编号如何产生?
-32位:
32根地址线/数据线,地址线-电线-通电,电信号就可以转换成数字信号(1/0)
00000000000000000000000000000000(32位)
11111111111111111111111111111111 - 共2的32次方个信号
-内存单元都有编号,这个编号就是地址

*//%p - 打印地址(起始地址)
- 会显示最小的那个地址

* int a = 10;
  int * pa = &a;        //pa 是用来存放地址的,所以我们把pa叫指针变量
(*告诉我们pa是一个指针变量,in告诉我们,pa指向对象是int类型)

    char ch = 'w';
    char * pc = &ch;
    *pc = 'q';        // *叫解引用操作符,他的意思是通过pc存放的地址,找到pc指向的内容
    (把ch的内容改成'q')
    printf("%c\n",ch);//"w"——>"q"
    (%c表示输出单个字符)

14.2 一些细节

*一个数字在C语言中是2、4、8个字节,以int类型、float类型和double类型来表示。
 int* pa = &a;    //int类型占用2字节内存,表示整数
 char* pc = &ch;
 printf("%d\n",sizeof(pa));    //4
 printf("%d\n",sizeof(pc));    //4

*32位平台 指针大小是4个字节
 64位平台 指针大小是8个字节


15.结构体(集中属性,结合来描述某一/几件事物) 

(typedef重命名)struct Stu        //struct描述的变量是结构体变量
{
    char name[20];  //名字-字符串
    int age;    //年龄 - 整数
    char sex[5];  //性别(一个汉字占两个字符0
    char id[20];  //学号 - 字符串
}(Stu;重命名)

void print(struct Stu* ps)
{
    printf("%s %d %s %s\n", (*ps).name, )
    printf("%s %d %s %s\n",ps->name, )//简便方法
    //->结构成员访问操作符
    //简便方法:(左边)结构体指针 ->结构体成员(右边)
}

int main()
{
    //结构体变量struct ...
    struct Stu s1 = {"张三",18,"男","2021060701"};
    (Stu s2 = (重命名))    

    //输入结构体数据
    scanf("%s %d %s %s", s1.name, &(s1.age0, s1.sex, s1,age);
    注:因为数组名本来就是地址,因此不用取地址

    //直接打印(输出)
    printf("%s %d %s %s\n", s1.name, s1.age, s1sex, s1.id);

    //. 结构成员访问操作符
    //(左边)结构体变量. 结构体成员(右边)    

    
    //使用函数打印(引用上方void print函数)
    print(&s2);
}


16.结语 

看到这里,相信老铁们对C语言已经有了更深刻的了解。我是计算机海洋的新进船长Captain_ldx,如果我的文章能对您有帮助的话,麻烦各位观众姥爷们点赞、收藏、关注我吧!后期重点注释和知识点将持续更新......

你可能感兴趣的:(C语言,c语言)