C语言概述

1.C的起源和发展C ——> C++ ——> Java | C#面向过程 ——> 面向对象
2.C的特点优点: 代码量小|速度快|功能强大缺点:危险性高|开发周期长|可移植性不强
3.C的应用领域系统软件

C语言编程预备知识:

1.CPU、内存条、硬盘、显卡、主板、显示器之间的关系
2.HelloWorld程序如何运行起来
3.什么是数据类型数据储存->数据分类基本类型数据->整数|浮点数(实数)|字符整数:   整形-int    4byte   短整型-short int 2byte 长整型-long int  8byte浮点数:单精度浮点数-float   4byte 双精度浮点数-double  8byte字符:char 1byte复合类型数据->结构体枚举*共用体
4.什么是变量变量的本质就是内存中的一段存储空间;变量存放在内存中,程序终止后变量所占的空间被释放掉;
5.CPU、内存条、vc++6.0、操作系统之间的关系
6.变量为什么必须初始化内存中存在垃圾数据-提醒初始化操作系统-系统分配表-(0|1)标识
7.如何定义变量数据类型 变量名 = 数据;||数据类型 变量名;变量名 = 数据;eg: int i = 11; 等价于 int i; i=11;
8.什么是进制二进制      010101八进制      01234567十进制      0123456789十六进制    0123456789ABCDEF
9.常量在C语言中如何表示整数:十进制:传统写法十六进制:前面加0x或0X 八进制:前面加零浮点数:传统写法:float x = 3.2;科学计数法:float x = 3.2e3;//x的值是3200字符:单个字符用单引号括起来  'a'字符串用双引号括起来    "jkjaslkjdl"
10.常量以什么样的二进制代码存储在计算机中编码 --- 补码 | IEEE754标准 | ASCII码整数是以补码的形式转化为二进制代码储存在计算机中;实数是以IEEE754标准转化为二进制代码存储在计算机中;字符的本质实际也是与整数的存储方式相同;字符->ASCII码->补码
11.代码规范化
12.字节存储数据的单位,是硬件所能访问的最小单位;软件-位运算符-可以控制位内存上存储的是位(0101)1 字节 = 8 位1 k = 1024 字节1 M = 1024 k1 G = 1024 M
13.不同类型数据之间相互赋值补码
14.ASCII码规定了不同字符使用那个整数值表示'A'-65 'a'-97 '0'-48ASCII码 | GB2312 | UTF-8
15.字符的存储字符的本质实际也是与整数的存储方式相同

基本的输入和输出函数的用法

输出:printf()---将变量的内容输出到显示器上1.printf("字符串");printf("hello!\n"); // \n换行2.printf("输出控制符", 输出参数);int i = 10;printf("%d\n",i); // %d十进制3.printf("输出控制符1 输出控制符2...", 输出参数1, 输出参数2...);int a = 11, b = 22;printf("%d %d\n", a, b);4.printf("输出控制符 非输出控制符", 输出参数);printf("i = %d, j = %d\n", i, j);输出控制符:%d      十进制---int%ld     长整型---long int%O      八进制---int|long int|short int%c      字符---char%s      字符串%f      实数---float%lf     实数---double%x|%X|%#x|%#X      十六进制---int|long int|short int为什么需要输出控制符:1.01组成的代码可以表示数据也可以表示指令2.如果01组成的代码表示的是数据,相同的01代码以不同的格式输出,输出结果不同

键盘输入:scanf()

键盘输入:scanf()---通过键盘将数据输入到变量中1.scanf("输入控制符", 输入参数);功能:将键盘输入字符 转换为 输入控制符规定格式的数据;存入以输入参数的值为地址的变量中;int i;scanf("%d", &i); // &i ---表示i的地址; &-取地址符;printf("i = %d\n", i);2.scanf("非输入控制符 输入控制符", 输入参数);功能:将键盘输入字符 转换为 输入控制符规定格式的数据;存入以输入参数的值为地址的变量中;非输入控制符必须原样输入;//非输入控制符-原样输出int i;scanf("m%d", &i); // &i-表示i的地址; &-取地址符;printf("i = %d\n", i);//多次输入int a, b;scanf("%d %d", &a, &b);printf("a = %d b =%d\n", a, b);

运算符

算术运算符   +   -   *   /   %
关系运算符   >  >=  <   <=  !=  ==
逻辑运算符   &&(且)   ||(或)  !(非)
赋值运算符   =   +=   -=    *=  /=
优先级      算术 > 关系 > 逻辑 > 赋值
---------------------------------
自增|自减   ++i|--i     i++|i--
三目运算符  int i > 3 ? ture : false
逗号表达式  (A, B, C, D) ---从左到右执行,最终结果是D执行的值

流程控制

流程控制:程序代码执行的顺序
流程控制的分类:1.顺序2.选择if | if...else... | if...else if...else...if的范围:if默认只能控制一个语句; 如果想控制多个语句可以用 {} 括起来;switch3.循环定义:某些代码会被重复执行分类:forwhiledo...while

break | continue

数组

为什么需要数组:1.保存大量同类型的数据2.模拟现实世界//一维直线|二维平面|三维立体空间|四维-空间+时间
数组的分类:一维数组 arr[n]1.为n个变量连续分配存储空间2.变量数据类型必须相同3.变量所占字节大小必须相等4.初始化1.完全初始化int a[5] = {1,2,3,4,5};2.不完全初始化---未初始化变量自动填充0int a[5] = {1,2,3};3.不初始化---所有元素都是垃圾值int a[5];4.清零int a[5] = {0};赋值 | 排序 | 求最大/最小值 | 倒序 | 筛选 | 插入 | 删除---利用工具二维数组 arr[i][j]int a[3][4]={{1,2,3,4},{2,2,3,4},{3,2,3,4}};多维数组 不存在多维数组;因为内存是线性一维的;

*函数——面向过程(基本单位是函数)

1.为什么需要函数避免了重复性操作有利于程序的模块化---C语言的基本单位是函数
2.什么叫函数逻辑上:能够完成特定功能的独立的代码块物理上:能够接收数据;也可以不接收数据;能够处理接收的数据;也可以不处理;能够将数据处理的结果返回;也可以不返回值;总结:函数是工具,他是为了解决大量类似问题设计的;函数可以当做一个黑匣子;
3.定义函数函数返回值 函数名 (函数形参列表){函数执行体}1.函数定义的本质是详细的描述了函数功能实现的细节;2.return表达式-终止函数;3.函数返回值的类型也称为函数的类型;
4.函数分类有参函数|无参函数有返回值|无返回值库函数|用户自定义值传递函数|地址传递函数普通函数|主函数(mian)*** 一个程序只能有且仅有一个主函数;主函数可以调用普通函数;普通函数不能调用主函数;普通函数之间可以相互调用;主函数是程序的入口,也是程序的出口
5.注意的问题1.函数调用和函数定义的顺序如果函数调用写在了函数定义前面,需要加函数前置声明;函数前置声明:告诉编译器即将可能出现的函数;形参、返回值的具体情况;对库函数的声明通过 #include <库函数所在文件名.h> 来实现;2.形参和实参个数相同、位置一一对应、数据类型必须相互兼容;3.如何在软件开发中合理的设计函数来解决实际问题?一个函数的功能尽量独立单一;函数是C语言的基本单位|类是Java、C#、C++的基本单位
6.常用的系统函数1.double sqrt(double x)求x的平方根2.int abs(int x)求x的绝对值3.double fabs(double x)求x的绝对值
7.递归 栈 - 先进后出的存储结构 压栈出栈

变量的作用域和存储方式

按作用域分:全局变量在所有函数外部定义的变量;使用范围:从定义位置到整个程序结束;局部变量在函数内部定义的变量或函数的形参;使用范围:只能在本函数内部使用;全局变量和局部变量命名冲突局部变量屏蔽全局变量
按变量的存储方式:静态变量自动变量寄存器变量

指针

int * 类型 实际是存放int类型地址的类型;
*p 就是以p的内容为地址的变量;指针的重要性:表示一些复杂的数据结构;快速的传递数据;使函数返回一个以上的值;能直接访问硬件;能够方便的处理字符串;理解面向对象的引用功能;
指针定义:地址:内存单元的编号;从零开始的非负整数;范围-4G[0-(4G-1)]指针:指针就是地址,地址就是指针;指针变量就是存放内存编号的变量;指针变量就是存放地址的变量;指针和指针变量是不同的概念;指针的本质就是一个操作受限制的非负整数;(只能相减)
指针的分类:1.基本类型指针int * p;int n = 123;p = &n;printf("%d\n", p);printf("%d\n", *p);//*p-以p的内容为地址的变量;附注:1. * 的含义:1.乘法2.定义指针变量  int * p3.指针运算符-取地址逆运算符 *p2. 通过被调函数修改主调函数的普通变量的值;
 void f(int * p, int * q){*p = 1;*q = 2;return;}int main(void){int a = 3, b = 5;f(&a, &b);printf("%d %d", a, b);return 0;}
    2.指针和数组1.指针和一维数组1.数组名一维数组名的含义:arrName == &arrName[0]一维数组名是一个指针常量,存放的一维数组第一个元素的地址;2.下标和指针的关系
 //输出一维数组的内容void f(int * pArr, int len){// *pArr;       // a[0]// *(pArr + 1); // a[1]// printf("%d\n", *pArr); // 1// printf("%d\n", *(pArr + 1)); // 2int i;for (i = 0; i < len; i++)printf("%d\n", *(pArr + i)); //*pArr *(pArr+1) *(pArr+2) *(pArr+3) *(pArr+4)}int main(void){int a[5] = {1, 2, 3, 4, 5};int b[6] = {6, -1, 2, -3, 4, -5};int c[50] = {11, 22, 33, 44, 55};f(a, 5); // a 是 int * 类型f(b, 6);f(c, 50);return 0;}
                如果p是个指针变量,则p[i]永远等价于 *(p+i);3.指针变量的运算1.指针变量只能相减 | 不能加、不能乘、不能除2.如果两个指针变量指向的是同一连续空间中的不同存储单元,则这两个指针变量才可以相减;int a[5];int *p;int *q;p = &a[1];q = &a[4];printf("%d", q - p);// 34.确定一个一维数组需要几个参数(如果一个函数要处理一个一维数组,需要接收该数组的那些信息);
   //输出一维数组的内容void f(int * pArr, int len){// *pArr;       // a[0]// *(pArr + 1); // a[1]// printf("%d\n", *pArr); // 1// printf("%d\n", *(pArr + 1)); // 2pArr[3] = 666; // pArr[3] 等价于 *(pArr+3)// printf("%d\n", &pArr[3]);int i;for (i = 0; i < len; i++)printf("%d\n", *(pArr + i));//*pArr *(pArr+1) *(pArr+2) *(pArr+3) *(pArr+4)}int main(void){int a[5] = {1, 2, 3, 4, 5};int b[6] = {6, -1, 2, -3, 4, -5};int c[50] = {11, 22, 33, 44, 55};f(a, 5); // a 是 int * 类型f(b, 6);f(c, 50);// printf("%d\n", &a[3]);// printf("%d\n", &b[3]);// printf("%d\n", &c[3]);return 0;}
                1.数组第一个元素的地址2.数组长度5.一个指针变量占几个字节指向char时 1byte指向int时4byte指向double时8bytesizeof(数据类型) | sizeof(变量)sizeof(int) = 4;sizeof(double) = 8;总结:一个指针变量,无论他指向的变量占几个字节,它本身只占8字节(CPU-64);2.指针和二维数组3.指针和函数4.指针和结构体5.多级指针

结构体

1.为啥需要结构体为了表示一些复杂的事物,普通的基本类型无法满足实际要求;
2.啥是结构体把一些基本类型数据组合在一起形成一个新的复合数据类型;
3.定义结构体1.第一种-推荐
 struct Student{int age;float score;char sex;};int main(void){struct Student stu1 = {60, 88.8, 'F'};return 0;}
    2.第二种-不推荐
  struct Student2{int age;float score;char sex;}stu2;
    3.第三种-不推荐
  struct{int age;float score;char sex;}stu3;
4.使用结构体1.赋值和初始化定义的同时可以整体赋值;定义完后,只能单个赋值;2.取除结构体变量中的每一个成员1.结构体变量名.成员名printf("%d %f %c\n", stu1.age, stu1.score, stu1.sex);//60 88.800003 F2.指针变量->成员名  --在计算机内部会转化为--> (*指针变量名).成员名
 eg:struct Student{int age;float score;char sex;};int main(void){// 初始化 赋值struct Student stu1 = {60, 88.8, 'F'};struct Student *pstu1 = &stu1;pstu1->age = 25;//pstu1->age会被转换成 (*pstu1).age//(*pstu1).age == stu1.age//pstu1->age 的含义: //pstu1所指向的结构体变量中的age这个成员struct Student stu2;stu2.age = 18;stu2.score = 99;stu2.sex = 'f';printf("%d %f %c\n", stu1.age, stu1.score, stu1.sex);//25 88.800003 Fprintf("%d %f %c\n", stu2.age, stu2.score, stu2.sex);//18 99.000000 freturn 0;}
    3.结构体变量的运算结构体变量可以相互赋值 | 不能加、不能减、不能乘、不能除struct Student st1,st2;st1 = st2;4.结构体变量和结构体指针作为函数参数传递的问题推荐使用结构体指针变量作为函数参数来传递5.举例

```ceg:struct Student{int age;float score;char name[100];};int main(){int len;struct Student *pArr;int i, j;struct Student t;// 动态构造一维数组printf("please input student msg: \n");printf("len = ");scanf("%d", &len);pArr = (struct Student *)malloc(len * sizeof(struct Student));// 输入for (i = 0; i < len; i++){printf("please input No: %d student msg:", i + 1);printf("age = ");scanf("%d", &pArr[i].age);printf("name = ");scanf("%s", pArr[i].name); //name是数组名 不用加 &printf("score = ");scanf("%f", &pArr[i].score);}// 按学生成绩排序-升序for (i = 0; i < len - 1; i++){for (j = 0; j < len - 1; j++){if (pArr[j].score > pArr[j + 1].score){t = pArr[j];pArr[j] = pArr[j + 1];pArr[j + 1] = t;}}}// 输出for (i = 0; i < len; i++){printf("age = %d\r\n", pArr[i].age);printf("name = %s\r\n", pArr[i].name);printf("score = %f\r\n", pArr[i].score);printf("\n");}return 0;}

6.链表

专题:
*动态内存分配1.传统数组的缺点:1.数组的长度必须提前指定,且只能是常整数,不能是变量;int a[5];//okint len = 5; int a[len];//error2.传统形式定义的数组,该数组的内存程序猿无法手动释放;在一个函数运行期间,系统为该函数中数组分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放;3.数组的长度一旦定义,其长度就不能再更改;数组的长度不能在函数运行的过程中动态的扩充或缩小;4.A函数定义的数组再A函数运行期间可以被其他函数使用,但A函数运行结束后A函数中的数组将不能被其他函数使用;传统方式定义的数组不能跨函数使用;2.为啥需要动态内存分配:很好的解决了传统方式定义的数组不能跨函数使用义的缺陷;传统数组也叫静态数组;3.动态内存分配举例-动态数组的构造:
  eg: #include <malloc.h>#include <stdio.h>int main(){int a[5]; //静态数组// 动态构造一维数组int len;int *pArr;printf("please input your element number:");scanf("%d", &len);//动态构造了一个一维数组 类似 int pArr[len]pArr = (int *)malloc(4 * len);// printf("%d\n", pArr);// 操作动态一维数组// *pArr = 11;// printf("%d\n", pArr[0]);int i;for (i = 0; i < len; i++)scanf("%d\n", &pArr[i]);printf("pArr content is:\n");for (i = 0; i < len; i++)printf("%d\n", pArr[i]);// realloc(pArr, 100);//动态拓展动态数组free(pArr);//手动释放掉动态一维数组return 0;}
    4.静态内存和动态内存的比较:静态内存是由系统自动分配,由系统自动释放;静态内存是在栈分配的;   -压栈出栈动态内存是由程序猿手动分配,手动释放;动态内存是在堆分配的;   -堆排序堆由malloc函数分配的;5.跨函数使用内存的问题:
**枚举**枚举就是把一个事物所有可能的取值一一列举出来枚举使代码更安全,但书写麻烦;
 eg:enum WeekDay{MonDay,TuesDay,WednesDay,ThursDay,FriDay,SaturDay,SunDay};int main(void){enum WeekDay day = MonDay;printf("%d\n", day);// 0enum WeekDay day1 = SunDay;printf("%d\n", day1);// 6return 0;}
进制转换r进制 转 十进制---1234(10) = 4 + 3 *10 + 2*10*10 + 1*10*10*1010101(2) = 1 + 0*2 + 1*2*2 + 0*2*2*2 + 1*2*2*2*2 = 21371(8) = 1 + 7*8 + 3*8*8 = 249十进制 转 r进制---除r取余,直至商0,余数倒序排列;
原码符号-绝对值码0表示正 1表示负 其余二进制位是该数字的绝对值的二进制位原码简单 加减运算复杂 零的表示不唯一存在加减乘除四种运算,增加了CPU的复杂度
反码所有数字取反
移码移码表示数值平移n位,n称为移码量;移码主要用于浮点数的接码的存储;
补码---解决整数的存储1.十进制转二进制1.正整数转二进制除2取余,直至商为零,余数倒序排列2.负整数转二进制先求与该负数相对应的正整数的补码,然后将所有位取反,末尾加1,不够位数时,左边补0;eg: -3--->011--->100--->1013.零转二进制全是零2.二进制转十进制1.如果首位是0,则表示正整数,按普通方法求2.如果首位是1,则表明是负整数,将所有位取反,末尾加1,所得数字就是该负数的绝对值;---------------------------------------1.Vc++6.0中一个int类型的变量能存储的数字范围int 类型变量所能存储的最大正整数十六进制最大整数:7FFFFFFFint 类型变量所能存储的绝对值最大的负整数十六进制最大整数:800000002.绝对值最小的负数的二进制代码3.最大正数的二进制代码4.已知一个数字的二进制代码求原数字5.数字超过最大整数6.不同类型数据的相互转换
**位运算符**    &   ---按位与   1&1 = 1; 1&0 = 0; 0&0 = 0;|   ---按位或   1&1 = 1; 1&0 = 1; 0&0 = 0;~   ---按位取反^   ---按位亦或   -相同为0,不同为1  1^0 = 1;1^1=0;0^0=0;<<  ---左移   -左移n位相当于乘以2的n次方>>  ---右移   -右移n位相当于除以2的n次方,前提是数据不能丢失意义:可以对数据的操作精确到位
字符串的处理
**链表**算法: 通俗定义:解题的方法和步骤狭义定义:对存储数据的操作;不同的存储结构,要完成的某一个功能所执行的操作是不一样的;算法是依附于存储结构的,不同的存储结构,所执行的算法不一样;广义定义:广义的算法也叫泛型; 无论数据怎么存储,对该数据的操作都一样;**类比数组:**数组:优点: 存取速度快缺点:需要一个很大的连续空间插入和删除元素的效率很低链表:优点: 插入和删除元素的效率高不需要一个很大的连续空间缺点:查找元素速度慢专业术语:首节点:存放第一个有效数据的节点;尾节点:存放最后一个有效数据的节点;头结点:头结点的数据类型和首节点一样;头结点是首节点前面的那个节点;头结点并不存放有效数据;设置头结点是为了方便链表操作;头指针:存放头结点地址的指针变量;确定一个链表只需要一个参数:头指针

eg:#include <stdio.h>int mian(){printf("qqq");return 0;}//编译:gcc -g 1.c -o 1.exe//运行:1.exe

C语言基础-笔记分享相关推荐

  1. Swift语言基础笔记(二)

    接上一篇: Swift语言基础笔记(一)介绍了整形.浮点型.布尔类型,这篇接着介绍下字符.字符串.元组.可选型等类型. 字符和字符串的使用 //: Playground - noun: a place ...

  2. java语言基础笔记——语句,函数

    java语言基础笔记 语句 判断结构(重点) 三种格式: 第一种:   if(条件表达式){ 执行语句;         }   System.out.println();   举例:   int a ...

  3. 重走c语言—摸鱼大学生的c语言基础笔记

    这里是太阳 这是第一篇正式博客,之前有过很多次想法,但是后来因为很多原因,都没有进行写作 作为C站的新面孔,这里自我介绍一下,网上的朋友都管我叫太阳,所以就自然而然把太阳作为虚拟的名字了.当代计算机系 ...

  4. SQL Server 数据库基础笔记分享(上)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  5. 初学Verilog语言基础笔记整理(实例点灯代码分析)持续更新~

    实例:点灯学习 一.Verilog语法学习 1. 参考文章 刚接触Verilog,作为一个硬件小白,只能尝试着去理解,文章未完-持续更新. 参考博客文章: Verilog语言入门学习(1) Veril ...

  6. Swift语言基础笔记(一)

    Swift是苹果公司2014年推出的全新编程语言,继承了C.Objective-C的特性,目前已经发布了Swift 3:它是一种现代的强类型的语言,具有兼容.开源.简洁的特点,也是一种安全的语言,苹果 ...

  7. python语言基础笔记_python语言学习笔记整理

    什么是程序? 程序等于数据结构加算法,那么数据结构是一个静态的东西,算法是一个动态的东西,我们用一个新的语言编写这个程序,我们要考虑到语言也主要由数据结构和算法相关的东西,或静态或动态的东西来构成,所 ...

  8. c++类指针赋值表达式必须是可修改的左值_C生万物,编程之本!(c语言基础笔记)

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  9. C语言基础笔记之12:存储类别、链接和内存管理

    Tips1: 关键字:auto.extern.static.register.const.volatile.restricted. _Thread_local._Atomic 函数:rand().sr ...

最新文章

  1. CPU的自动调度矩阵乘法
  2. mysql占位符 防注入_php mysql中防注入的几个小问题,麻烦大大帮我解答谢谢
  3. java调用命令行命令_Java命令行界面(第4部分):命令行
  4. Docker:Docker 性质及版本选择 [三]
  5. OC中解析对象(json)
  6. mysql-5.6.24-win32.zip 下载 安装 配置 创建数据库
  7. nyoj--49--开心的小明(背包)
  8. 通过一个月时间字段分组
  9. 记centos7.2+上tomcat启动成功的监控脚本和nginx可配置多个域名
  10. IT 常用词汇(一)
  11. MTK Android 修改权限读取IMEI
  12. 东芝移动硬盘无法弹出密保,无法执行该软件,因为未启动需要的服务程序
  13. python 将图片转换成像素画_python画像素图
  14. java邮件发送 qq与163邮箱互发和qq和163邮箱发送其他邮箱实例
  15. 传智博客JAVA基础第二十三天
  16. 树莓派安装Jupyter Notebook实现网页编程
  17. python求一元三次方程的根_一元高次方程寻根记杂谈
  18. Windows下运行python脚本报错“ImportError: No Module named ...”的解决方法
  19. windows powershell实战指南(第3版)_Windows命令行工具cmder配置(转)
  20. Linux安装jdk报错:package jdk-16.0.2-2000:16.0.2-ga.aarch64 is intended for a different architecture

热门文章

  1. 实时互动RTI技术,生成式AI虚拟数字人,构建元宇宙基础设施,CloudXR开启元宇宙通道...
  2. 基于微服务的 Real DevOps 实践
  3. 网络安全培训课程自学
  4. Linux/Windows 平台最容易安装 Composer教程
  5. Ubuntu C/C++ 获取系统时间
  6. [ASP.NET]DataBinder.Eval用法,文本绑定
  7. Python超级玛丽马里奥源代码
  8. Socket编程,自己电脑做服务端和客户端
  9. 2012搜狗校园招聘笔试题(1)
  10. 现在6岁的小朋友都开始学编程了……