C语言学习笔记

C语言学习笔记——学习前准备

关于博客

养成写博客的习惯。

博客的重要性:

1、自己写博客,是对所学的知识的总结

2、写博客可以记录你学习的一个过程和心得,在简历上可以给面试官更多了解你的机会,同时则会增加面试的谈资。

3、写博客说明你是一个愿意分享的人。

比较推荐的博客网站:

优快云、博客园、51CTO、开源中国、自己搭建(服务器+域名;GitHub博客)

GitHub

GitHub网址:http://github.com/(国外/网络要求高/访问慢)

gitee网址:http://gitee.com/(国内/访问速度快)

1. 大公司喜欢的东西

2. 下去先了解,再注册一下github账号

3. 慢慢扩展学习 git(不能只懂三板斧)

电子笔记

印象笔记、有道云笔记、processon——笔记可以检索,不容易丢,随时随地可以复习。

xmind——思维导图,整理一门课程学完后的框架。

学好编程,不仅仅是学好C语言

必须要学好:计算机语言、算法和数据结构、操作系统、计算机网络、项目实战。

C语言学习笔记——Day 01

一、初识C语言

基本了解C语言的基础知识,对C语言有一个大概的认识。

每个知识点就是简单认识,不做详细讲解,后期课程都会细讲。

二、什么是C语言

C语言是一门计算机语言

计算机语言:人和计算机交流的语言

种类:汇编语言、C/C++/Java/python

计算机语言的发展:

二进制语言:硬件——电信号——正电(1)/负电(0) 

eg:10010011 001010101

汇编语言:将特殊的二进制语言用助记符表示。

eg:10010011-ADD(定义为加法)

高级语言:C/C++/Java/python

三、第一个C语言程序

写C语言代码

1、创建工程

2、创建项目

3、写代码

固定的格式:

#include <stdio.h>//头文件
//主函数
int main(){
    //在这里写代码
    
    return 0;//返回值
}

 int- 表示数据类型为整型

main-程序的入口,一个程序有且只有一个main函数

在屏幕上打印"hello world":

调用printf方法:printf-用于输出

"\n"表示换行

注意:每一句C语言代码写完后必须要以";"结尾

#include <stdio.h>//头文件
//主函数
int main(){
    //在这里写代码
    printf("hello word");
    return 0;//返回值
}

​

四、数据类型

1、种类:

int-整型

short-短整型

long-长整型

(long long-更长的整型(C99中))

float-单精度浮点型

double-双精度浮点型

char-字符型

2、数据类型的输出:

int-整型

#include <stdio.h>

int main(){
    int age = 10;
    printf("%d\n",age);
    return 0;
}

%d - 打印整型格式的数据

float-单精度浮点型:

#include <stdio.h>

int main(){
    float height = 163.50;
    printf("%f\n",height);
    return 0;
}

%f - 打印单精度浮点型型格式的数据

double-双精度浮点型:

#include <stdio.h>

int main(){
    double height = 163.50;
    printf("%lf\n",height);
    return 0;
}

%lf - 打印双精度浮点型型格式的数据

char-字符类型:

#include <stdio.h>

int main(){
    char ch = 'A';
    printf("%c\n",ch);
    return 0;
}

%c - 打印字符格式的数据

其他:%p - 以地址的形式打印

           %x - 以十六进制整数的形式打印数据

           %a(%A)- 以十六进制浮点数的形式打印数据(C99)

           %e(%E) - 浮点数指数输出[e-(E-)记数法] 

           %g(%G) - 浮点数不显无意义的零"0" 

           %i - 有符号十进制整数(与%d相同) 

           %u - 无符号十进制整数 

           %o - 八进制整数 

           %s - 字符串 

           %% - 输出字符% 

为什么出现这么的类型?

每种类型的大小是多少?

#include <stdio.h>

int main(){
    printf("%d\n",sizeof(char));
    printf("%d\n",sizeof(short));
    printf("%d\n",sizeof(int));
    printf("%d\n",sizeof(long));
    printf("%d\n",sizeof(long long));
    printf("%d\n",sizeof(float));
    printf("%d\n",sizeof(double));
    printf("%d\n",sizeof(long double));
    return 0;
}

C语言标准规定:sizeof(long)>=sizeof(int)

对于生活中不同的数据,采用不同的数据类型,可以提高计算机的内存的利用率。

3、计算机中的单位:

bit - 比特位

byte - 字节 (1 byte = 8 bit)

kb(1 kb = 1024 byte)、mb(1 mb = 1024 kb)、gb(1 gb = 1024 mb)、tb(1 tb = 1024 gb)、pb(1 pb = 1024 tb)

变量、常量

变量

1、定义:常量:值不变的量。

           变量:值可变的量。

2、定义变量的方法:

初始化:int age = 20;

赋值:int age;

           age = 20;

3、变量的分类:

局部变量:定义在代码块内部的变量,局部变量的使用范围只能在定义的代码块内。

全局变量:定义在代码块外部的变量。

#include <stdio.h>

int num = 20;//全局变量

int main(){
    int num = 10;//局部变量
    printf("%d",num);
    return 0;
}

程序运行结果:

局部变量和全局变量的名字建议不要相同,相同的话容易误会,产生bug;当局部变量和全局变量的名字相同时,局部变量优先。

4、变量的使用:

计算两个数相加的和:

#include <stdio.h>

int main(){
    int num1;//局部变量
    int num2;//局部变量
    int sum;
    printf("请输入两个操作数:");
    scanf("%d%d",&num1,&num2);
    sum = num1+num2;
    printf("sum = %d",sum);
    return 0;
}

程序运行结果:

5、作用域和生命周期:

作用域:局部变量的作用域是变量所在的局部范围。

              全局变量的作用域是整个工程。(extern-声明外部符号,声明后,全局变量便可以使用)

生命周期:局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期结束。

                  全局变量的生命周期是整个程序的生命周期。

常量

1、字面常量:直接写出的值。

2、const修饰的常变量。常变量是变量,只是它拥有常属性而已。

3、#define 定义的标识符常量。

4、枚举常量。枚举关键字:enum。

#include <stdio.h>

#define MAX 10//#define 定义的标识符常量

//枚举常量
enum Sex
{
    MALE,
    FEMALE
}

int main()
{
    3.14;//字面常量
    100;//字面常量
    const int num = 4;//const修饰的常变量
    /*num = 8;//错误,num为常变量,值不可更改*/
    printf("%d\n",MAX);
    enum Sex s = FEMALE;
    return 0;
}

五、字符串+转义字符+注释

字符串

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

#include <stdio.h>

int main()
{
    "abcdef";
    "hello world";
    "";//空字符串
    char arr1[] = "abc";//数组
    //"abc" -- {'a','b','c','\0'} '\0'字符结束的标志
    char arr2[] = {'a','b','c'};
    char arr3[] = {'a','b','c','\0'};
    // '\0' - 0
    // 'a' - 97(ASCII码)
    printf("%s\n",arr1);
    printf("%s\n",arr2);
    printf("%s\n",arr3);
    return 0;
}

 程序运行结果:

 转义字符

转义字符顾名思义就是转变意思。

常用转义字符

转移字符释义
\? 在书写连续多个问号时使用,防止他们被解析成三字母词(??+符号表示三字母词,会被解析为其他符号)
\'用于表示字符常量'
\“ 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符,即tab键
\v垂直制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0

#include <stdio.h>
int main()
{
    //问题1:在屏幕上打印一个单引号',怎么做?
    //问题2:在屏幕上打印一个字符串,自渡川的内容是一个双引号",怎么做?
    printf("%c\n",'\'');
    printf("%s\n","\"");
    return 0;
}

程序运行结果:

 /ddd:

#include <stdio.h>
int main()
{
    //打印一个路径c:\test\32\test.c
    printf("c:\test\32\test.c\n");
    printf("%d\n",strlen("c:\test\32\test.c"));
    return 0;
}

 程序运行结果:

 /32 -- 32是2个8进制数字,32作为八进制代表的十进制数字,作为ASCII码值的对应的字符。

六、 注释

1. 代码中有不需要的代码可以直接删除,也可以注释掉。

2. 代码中有些代码比较难懂,可以加一下注释文字。

#include <stdio.h>
int main()
{
    /*C语言注释风格
    int sub(int x,int y)
    {
        return x-y;
    }
    */
    //C++注释风格
    //int a = 10;
    //printf("%d\n",a);
    return 0;
}

注释有两种风格:

C语言风格的注释 /*xxxxxx*/,缺陷:不能嵌套注释。

C++风格的注释 //xxxxxxxx,可以注释一行也可以注释多行。

七、选择语句

1、if-else语句

#include <stdio.h>
int main()
{
    int input = 0;
    printf("进入大学\n");
    printf("你要好好学习吗?(1/0)>:");
    scanf("%d",&input);
    if(input == 1){
        printf("好工作\n");
    }
    else{
        printf("打工仔\n");
    }
    return 0;
}

2、switch-case语句(多分支选择语句)

#include <stdio.h>
int main()
{
    double num1,num2;
    char op;
    printf("请输入一个表达式:");
    scanf("%lf%c%lf",&num1,&op,&num2);
    switch(op) {
        case '+':
            printf("计算结果为:%.2f\n",num1+num2);
            break;
        case '-':
            printf("计算结果为:%.2f\n",num1-num2);
            break;
        case '*':
            printf("计算结果为:%.2f\n",num1*num2);
            break;
        case '/':
            if(num2 != 0) {
                printf("计算结果为:%.2f\n",num1/num2);
            }
            else {
               printf("num2不能为0");
            }
            break;
    }
    return 0;
}

程序运行结果:

 

 八、循环语句

1、while循环

#include <stdio.h>
int main()
{
    int line = 0;
    while(line < 2000) {
        printf("敲%d行代码\n",line+1);
        line++;
    }
    if(line>=2000) {
        printf("恭喜你,可以得到一个好工作!\n");
    }
    return 0;
}

程序运行结果:

2、do- while循环

#include <stdio.h>
int main()
{
    int line = 0;
    do {
        printf("敲%d行代码\n",line+1);
        line++;
    }
    while(line < 2000);
    if(line>=2000) {
        printf("恭喜你,可以得到一个好工作!\n");
    }
    return 0;
}

 程序运行结果:

 while循环和do-while循环的区别:while循环时先判断一次再来执行,do-while循环是先执行一次,然后再来判断。

3、for循环

计算1到100内整数相加的和:

#include <stdio.h>
int main()
{
    int i;
    int sum = 0;
    for(i = 1;i<=100;i++) {
        sum+=i;
    }
    printf("%d",sum);
    return 0;
}

程序运行结果:

for循环与while、do-while循环的区别:

循环次数已知,使用for循环;循环次数未知,且循环条件在进入循环前已经明确,使用while循环; 循环次数未知,而循环条件需要在循环体中明确,使用do-while循环。 

九、函数

函数是一个完成特定工作的独立程序块,包括库函数和自定义函数两种。例如:scanf(),printf()就是库函数。

两个数的加法运算

#include <stdio.h>
int main()
{
    int num1 = 10,num2 = 20;
    int a = 100,b = 200;
    int sum;
    sum = num1+num2;
    printf("%d\n",sum);
    sum = Add(num1,num2);
    printf("%d\n",sum);
    sum = Add(a,b);
    printf("%d\n",sum);
    return 0;
}
//函数
int Add(int x,int y)
{
    int z = x+y;
    return z;
}

程序运行结果:

 函数的特点就是简化代码,代码复用。

十、数组

要存储1-10的数字,怎么存储?

C语言中给了数组的定义:一组相同类型元素的集合。

1、数组的定义

#include <stdio.h>
int main()
{
    int arr[10] = {0,1,2,3,4,5,6,7,8,9};
    return 0;
}

2、数组的下标

C语言规定数组的每个元素都有一个下标,下标是从0开始的。

数组可以通过下标来访问的。

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

程序运行结果:

 十一、操作符

1、算术操作符

算术操作符作用
+加法运算
-减法运算
*乘法运算
/除法运算
%取模运算,得到余数

2、移位操作符

移位操作符作用
<<左移,左边丢弃,右边补零
>>右移,右边丢弃,左边补零

 3、位操作

位操作作用
&按二进制位与
^按二进制位异或
|按二进制位或

与运算(&):0&0=0;0&1=0;1&0=0;1&1=1;两个同时为1,结果为1,否则为0

或运算(|):0|0=0;  0|1=1;  1|0=1;   1|1=1;参加运算的两个对象,一个为1,其值为1。

异或运算(^):0^0=0;  0^1=1;  1^0=1;   1^1=0;参加运算的两个对象,如果两个位为“异”(值不同),则该位结果为1,否则为0。

4、赋值操作符

赋值操作符作用
=简单的赋值运算符,把右边操作数的值赋给左边操作数
+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数。(a+=10等价于a=a+10)
-=减且赋值运算符﹐把左边操作数减去右边操作数的结果赋值给左边操作数
*=乘且赋值运算符﹐把右边操作数乘以左边操作数的结果赋值给左边操作数
/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数
&=按位与且赋值运算符
^=按位异或且赋值运算符
|=按位或且赋值运算符
>>=右移且赋值运算符
<<=左移且赋值运算符

5、单目操作符

单目操作符作用
逻辑反操作
负值
正值
取地址
sizeof计算变量或类型所占空间的大小,单位是字节
~对一个数的二进制按位取反
-- 前置、后置--,自减
++前置、后置++,自增
间接访问操作符(解引用操作符)
(类型) 强制类型转换

6、关系操作符

关系操作符

作用

>大于
<小于
>=大于等于
<=小于等于
!=判断是否不等于
==判断是否等于

7、逻辑操作符

逻辑操作符作用
&&逻辑与
||逻辑或

8、条件操作符(三目操作符)

条件操作符作用
exp1 ? exp2 : exp3表达式exp1结果为真就输出 exp2结果为假就输出 exp3

9、逗号表达式

逗号表达式作用
exp1, exp2, exp3, …expn

逗号表达式的运算过程为:从左往右逐个计算表达式。 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。

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

下标引用、函数调用和结构成员作用
[]下标引用操作符
()函数调用操作符
访问结构体成员
->访问结构体成员

十二、常见关键字

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

定义的变量名不能和关键字的名字相冲突,不能一样。

关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

#include <stdio.h>
int main()
{
    //typedef-类型重定义
    unsigned int num1 = 20;
    typedef unsigned int u_int;
    u_int num2 = 20;
    return 0;
}

关键字static

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

1. 修饰局部变量-静态局部变量。

#include <stdio.h>

void test()
{
    static int a = 1;
    a++;
    printf("a=%d\n",a);
}

int main()
{
    //static关键字
    int i = 0;
    while(i<5) {
        test();
        i++;
    }
    return 0;
}

 程序运行结果:

  static修饰局部变量时,局部变量的生命周变长。

2. 修饰全局变量-静态全局变量。

#include <stdio.h>

//声明外部符号
extern int add(int,int);

int main()
{
    extern int g_val;
    printf("g_val=%d\n",g_val);
    return 0;
}
//static修饰函数
static int g_val = 2020;

程序运行结果:

改变了变量的作用域。让静态的全局变量只能在自己所在的源文件内部使用,出了源文件没办法再使用了。

3. 修饰函数-静态函数

#include <stdio.h>

//声明外部函数
extern int add(int,int);

int main()
{
    int num1 = 10,num2 = 20;
    int sum;
    sum = add(num1,num2);
    printf("%d\n",sum);
    return 0;
}
//static修饰函数
static int add(int x,int y)
{
    return x+y;
}

程序运行结果:

 static修饰函数时,改变了函数的链接属性。普通函数是有外部链接属性的,而static修饰的函数的链接属性为内部链接属性。

十三、#define 定义常量和宏

#define 定义的标识常量

#include <stdio.h>

//#define 定义的标识常量
#define Max 100;

int main()
{
    int a = Max;
    printf("a=%d\n",a);
    return 0;
}

程序运行结果:

 #define 定义的宏

#include <stdio.h>

//#define 定义的宏
#define MAX(X,Y) (X>Y?X:Y)

int main()
{
    int a = 10;
    int b = 20;
    int max = MAX(a,b);
    printf("max=%d\n",max);
    return 0;
}

程序运行结果:

 十四、指针

1、内存

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

#include <stdio.h>

int main()
{
    int a = 10;//在内存中申请4个字节
    printf("%p\n",&a);
    return 0;
}

程序运行结果:

2、 指针

有一种变量是用来存放地址的,这类变量叫做指针

#include <stdio.h>

int main()
{
    int a = 10;//在内存中申请4个字节
    printf("%p\n",&a);
    //有一种变量是用来存放地址的,这类变量叫做指针
    int* p = &a;
    printf("%p\n",p);
    return 0;
}

程序运行结果:

 * :解引用操作符:

#include <stdio.h>

int main()
{
    int a = 10;//在内存中申请4个字节
    printf("%p\n",&a);
    //有一种变量是用来存放地址的,这类变量叫做指针
    int* p = &a;
    printf("%p\n",p);
    *p = 20;//* - 解引用操作符
    printf("a = %d",a);
    return 0;
}

程序运行结果:

 3、指针变量的大小

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

#include <stdio.h>

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

程序运行结果:

十五、结构体

 结构体是我们自己创建出来的一种类型,用于描述有多个属性的复杂对象,如:书-名字-作者-价格等属性。

#include <stdio.h>
#include <string.h>//strcpy函数的头文件

//创建一个结构体类型
struct Book
{
    char name[20];
    short price;
};

int main()
{
    //利用结构体类型创建一个该类型的结构体变量
    struct Book b1 = {"C语言程序设计",55};
    struct Book *p = &b1;//结构体类型变量的指针
    printf("书名:%s\n",b1.name);
    printf("价格:%d\n",b1.price);
    printf("%p\n",p);
    strcpy(b1.name,"C++");//字符串拷贝
    printf("修改后的书名:%s\n",b1.name);
    b1.price = 100;
    printf("修改后的价格:%d\n",b1.price);
    //利用指针p打印出书名和价格
    printf("书名:%s\n",(*p).name);
    printf("价格:%d\n",(*p).price);
    //简化操作
    printf("书名:%s\n",p->name);
    printf("价格:%d\n",p->price);
    return 0;
}

程序运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值