php做的网站缺点,1元购类似网站架设药多少钱,dw如何制作多个网页,哪里有培训网简介
学习计算机#xff0c;离不开C语言的学习#xff0c;而C语言学习过程中的视频课教程#xff0c;目前来说#xff0c;如果郝斌老师的C语言排第二#xff0c;没有人敢排第一 郝斌老师的C语言教程#xff0c;通俗易懂#xff0c;引人发思#xff0c;特别适合新手入门…简介
学习计算机离不开C语言的学习而C语言学习过程中的视频课教程目前来说如果郝斌老师的C语言排第二没有人敢排第一 郝斌老师的C语言教程通俗易懂引人发思特别适合新手入门以及提高强烈推荐学习 在学习过程中记录了一些笔记现整理出来做博客供大家参考~
学习视频地址《C语言学习》 学习方法论
在学习某个新知识点的时候可以用以下方法论来进行学习
WWHA
What什么是A Why为什么需要A How怎么使用A Attention需要注意哪些问题
C语言学习推荐的参考资料 谭浩强《C语言程序设计》 ps这本书是又爱又恨 《C和指针》 《C专家编程》 《C陷阱与缺陷》 林锐《高质量C/C编程》
变量
什么是变量
变量的本质就是内存中一段存储空间
数据存储是以“字节”Byte为单位数据传输大多是以“位”bit又名“比特”为单位
一个位就代表一个0或1即二进制每8个位bit简写为b组成一个字节Byte简写为B是最小一级的信息单位。 1字节(Byte) 8位(bit) 1bit就是二进制的0和1
计算机能够处理的最小单元是 字节 而不是位
位是由软件通过位运算符操作的
1个英文字母不分大小写占一个字节的空间
D十进制 B二进制 O八进制 H十六进制 基本数据类型所占字节大小
char 1个字节 int float 4个字节 double 8个字节 可以用sizeof()验证
其他类型所占字节大小
ASCII码关键值
‘0’ 48 ‘1’ 49… A 65 B 66… a 97 b 98…
关于数值不够存储溢出情况
char 占1个字节8位范围是 -27 ~ 27 - 1 -128 ~ 127 char a 127; 使用%d打印出来是127 char a 128; 使用%d打印出来是-128 char a 129; 使用%d打印出来是-127 char a 130; 使用%d打印出来是-126
scanf输入
scanf的作用将从键盘输入的字符转化为输入控制符所规定格式的数据然后存入以输入参数的值为地址的变量中。
sacnf(%d, i);中%d的作用 在输入过程中我们输入的都是字符1字符2字符3系统接收数据都是接收字符。系统如何能够知道我们输入的123是一百二十三而不是123呢 这就需要%d的作用让系统知道我们输入的是什么。
余数与正负符号的关系
13%3 1
13%-3 1
-13%3 -1
-13%23 -13
-13%-23 -13即取余后的符号只与前面的数据符号有关系
i1与i的区别
i1;内存-寄存器-内存 i;直接在寄存器中处理
逗号表达式
格式 (A, B, C, D) 功能 从左到右执行 最终表达式的值是最后一项的值 流程控制
顺序 选择 循环
技巧如何看懂一个程序 1流程 2每个语句的功能 3试数把程序运行一下
switch
执行完一个case语句后流程控制就转移到下一个case字句继续执行。“case”常量表达式只是起语句标号的作用并不是在该处进行条件判断。在执行switch语句时根据switch()中表达式的值找到与之匹配的case子句就从此case子句开始执行下去不再进行判断。 白话case只是程序的入口当找到入口后就会顺序执行下面的所有语句当然case语句没啥意义不算 若val 5,直接是default开始 若val2,是从2开始的而不是顺序执行从default开始的。 白话就是找入口不是顺序找会遍历里面所有的case有的话匹配没有的话default。 break continue
break如果用于循环是用来终止循环break如果用于switch则是用于终止switchbreak不能直接用于if除非if属于循环内部的一个子句这句话的意思是如果在if内部见到了break请注意它不作用在if上break作用在循环中在多层循环中break只能终止距离它最近的那个循环在多层switch嵌套中break只能终止距离它最近的switch 白话break 是结束此次循环
continue用于跳过本次循环余下的语句转去判断是否需要执行下次循环 白话continue是跳过循环后面的语句再次循环
作业题
判断一个数字是否是素数判断一个数字是否是回文数编程实现求一个十进制数字的二进制形式求一个数字的每位是奇数的数字取出来组合形成新数字求一个数字倒过来的数字斐波那契数列 郝斌老师对算法程序学习的一些建议 尝试自己去编程解决它大部分人都自己无法解决。如果过了15分钟还想不出来此时我建议你就可以看答案了。如果解决不了就看答案。关键是把答案看懂这个要花很大的精力也是我们学习的重点。看懂之后尝试自己去修改程序并且知道修改之后程序的不同输出结果的含义。照着答案去敲。调试错误。不看答案自己独立把答案敲出来。如果程序实在无法彻底理解就把它背会 是否是回文数也可使用这种判断 int zuiHouYiWei 0;int shengYu value;while (shengYu) {zuiHouYiWei shengYu%10;shengYu shengYu/10;sum sum*10 zuiHouYiWei;printf(zuiHouYiWei的值是%d\n, zuiHouYiWei);printf(shengYu的值是%d\n, shengYu);printf(sum的值是%d\n, sum);printf(------------\n);}数组
一维数组
怎么定义一维数组
为n个变量连续分配内存空间数组的内存一定是连续分配的所有的变量数据类型必须相同所有变量所占的字节大小必须相等
有关一维数组的操作 初始化、赋值、排序、求最大值\最小值、倒置、查找、插入、删除
初始化 完全初始化 int [5] {1, 2, 3, 4, 5}; 不完全初始化未被初始化的元素自动为零 int a[5] {1, 2, 3};//a[3] a[4] 0; 不初始化所有元素是垃圾值 int [5]; 清零 int a[5] {0}; 错误写法 int a[5]; a[5] {1, 2, 3, 4, 5};//错误 原因只有在定义数组的同时才可以整体赋值其他情况下整体赋值都是错误的。另a数组并没有a[5]元素 只有在定义的时候5表示个数其他在任意地方出现只是表示下标而非个数。
两个数组之间赋值
int a[5] {1, 2, 3, 4, 5}; int b[5]; 如果要把数组a中的值全部复制给b数组 错误的写法 b a a、b代表的数组名数组名是第一个元素的地址。 正确的写法
for (i 0; i 5; i)
{b[i] a[i];
}二维数组
int a[3][4] 总共12个元素可以当做3X4看待
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]a[i][j] 表示的是第i1行第j1列的元素
初始化
int a[3][4] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int a[3][4] {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}
};操作 二维数组的输出 二维数组的排序 求每一行的最大值 判断矩阵是否对称
多维数组
是否存在多维数组不存在 原因因为内存是线性一维的 n维数组可以当做每个元素是n-1维数组的数组 比如int[3][4]可以看成3个一维数组每个数组里面有4个元素。 函数
对库函数的声明是通过与 #include库函数所在的文件的名字.h 来实现的
return 是终止整个函数的即遇到return,函数就结束
变量的作用域和存储方式
按作用域分
全局变量 在所有函数外部定义的变量叫全局变量 全局变量的使用范围从定义位置开始到整个程序结束局部变量 在一个函数内部定义的变量或者函数的形参都统称为局部变量 局部变量的使用范围只能在本函数内部使用 注意的问题 全局变量和局部变量命名冲突局部变量屏蔽全局变量
按变量的存储方式
静态变量 自动变量 寄存器变量
如何在软件开发中合理的设计函数来解决实际问题
一个函数的功能尽量独立、单一 多学习多模仿牛人的代码 指针
指针就是地址
地址就是内存单元的编号 每一个小单元有8位8个0或8个1 也就是说内存的编号不是以位算的是以字节算的 地址一般用16进制表示32位的操作系统中地址是32/84个字节。64位系统中地址占8个字节
指针的定义 地址 内存单元的编号 从零开始的非负整数 范围4G【0-4G-1】 指针 指针的本质就是 一个操作受限的 非负整数只能-不能*/
指针、指针变量
指针就是地址地址就是指针 指针变量就是存放地址的变量 也可以说 指针变量就是存放指针的变量
例如 int *p中p就是指针变量。 需要注意通常我们叙述时会把指针变量简称为指针实际上它们的含义并不一样 指针的重要性
可以表示一些复杂的数据结构 快速的传递数据 使函数返回一个以上的值 直接访问硬件 能够方便的处理字符串 是理解面向对象语言中引用的基础 总结指针是C语言的灵魂 指针的分类
1 基本类型指针 如何通过被调函数修改主调函数普通变量的值
1 实参必须为普通变量的地址2 形参必须为指针变量3 在被调函数中通过 *形参名 …… 的方式就可以修改主调函数相关变量的值
2 指针和数组 指针 和 一维数组 一维数组名是个指针常量存放的是一维数组第一个元素的地址。类型为int * 数组名是int *类型 数组下标和指针的关系
如果p是个指针变量则p[i]永远等价于 *(pi)
a[i] *(a i) int型 a[i] *(a i) a i int *型
然后当i 0时那么 a[0] *a int型 a[0] *(a) a; int *型
a ! a[0] a a[0] 确定一个一维数组需要几个参数
需要两个参数数组第一个元素的地址 数组的长度
指针变量的运算
指针变量不能 * / 如果两个指针变量指向的是同一块连续空间中的不同存储单元则这两个指针变量才可以相减
一个指针变量无论它指向的变量占几个字节该指针变量本身只占4个字节32位下 一个变量的地址是使用该变量的首字节地址来表示的
指针 和 二维数组
指针和函数
指针和结构体
多级指针 动态分配内存
传统数组的缺点
数组的长度必须事先制定且只能是常整数不能是变量 int a[5];//OK int len 5; int a[len];//error传统形式定义的数组该数组的内存程序员无法手动释放 在一个函数运行期间系统为该函数中数组所分配的空间会一直存在直到该函数运行完毕时数组的空间才会被系统释放数组的长度不能在函数运行过程中动态的扩充或缩小。A函数定义的数组在A函数运行期间可以被其他函数使用。但A函数运行完毕之后A函数中的数组将无法再被其他函数使用
为什么需要动态内存分配
动态数组很好的解决了传统数组的这4个缺陷传统数组 即 静态数组 动态内存分配举例动态数组的构造 静态内存和动态内存的比较
静态内存是由系统自动分配由系统自动释放 静态内存是在栈分配的
动态内存是由程序员手动分配手动释放 动态内存是在堆是指堆排序中分配的 结构体
参考C语言知识点—结构体 进制间转换
已知十进制求二进制 求正整数的二进制除2取余直至商为零余数倒叙排序 求负整数的二进制 先求与该负数相对应的正整数的二进制代码然后将所有位取反末尾加1不够位数时左边补1 例-3。其正整数3的二进制代码是011取反100末尾加1101。因为整数4个字节是4*832位而101只占3位其余29位都补成1。 求零的二进制全是零
已知二进制求十进制
如果首位是0则表明是正整数按普通方法来求如果首位是1则表明是负整数将所有位取反末尾加1所得数字就是该负数的绝对值如果全是零则对应的十进制数字就是零 位运算符 | ~ ^
通过位运算符我们可以对数据的操作精确到每一位 按位与 | 按位或 ~ 按位取反把变量所有二进制取反 ^ 按位异或相同为0不同为1
1^01 0^1 1
1^1 0 0^0 0按位左移 按位右移
十进制123左移一位成了1230相当于乘10 十进制123右移一位成了12.3相当于除10
同理二进制左移1位相当于乘2右移1位相当于除2左移n位相当于乘以2n C程序测试题
1 什么叫分配内存什么叫释放内存
操作系统把某一块内存空间的使用权利分配给该程序 叫分配内存 操作系统把分配给该程序的内存空间的使用权利收回改程序就不能够再使用这一块内存空间这叫释放内存 ps:释放内存不是把该内存的内容清零 2 变量为什么必须初始化
不初始化则变量通常就是垃圾值
3 静态变量与动态变量的异同
相同都需要分配内存 不同 静态变量是由系统自动分配自动释放 静态变量是在栈中分配的 函数终止后静态变量的存储空间被系统自动释放
动态变量是由程序员手动分配手动释放 动态变量是在堆中分配的 程序员可以在函数执行的过程中的任何一个时刻手动释放动态变量的空间不需要等到函数终止时才释放
4 判断下列程序语法上是否有错误
A int *p; *p 10; 错 B char *p; char ch A; p ch; 对 错 char ch ‘A’; C int i,j; ij0; int *p; pi; 对 D int *p; int **q; qp; 对 E int *p; int i 5; pi; *p 10; 对
二进制全部为零的含义 —000000000000的含义 1 数值零 2 字符串结束标记符’\0’ 3 空指针NULL NULL本质也是零但这个零不代表数字零而表示的是内存单元的编号零是个地址 计算机规定以零为编号的存储单元的内容不可读、不可写