![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
文章平均质量分 56
算法与数据结构
投篮
主要专注方向:智能硬件
展开
-
第一章:程序的基本概念
所以,解释程序是这样一种程序,它能够按照源程序中语句的动态顺序,逐句地分析解释并执行,直至源程序结束。argv是一个二级指针,或者说是一个指向字符串的指针数组,写成char * argv[]也可,它代表命令行所有的参数,包括命令本身在内。首先你用文本编辑器写一个C程序,然后保存成一个文件,这称为源代码,然后运行编译器对它进行编译,编译的过程并不执行程序,而是将源代码全部翻译成机器指令,再加一些描述信息,生成一个新的文件,称为目标代码或可执行文件。所以了,用到标准输入输出函数时,就要调用这个头文件!原创 2017-07-14 14:58:50 · 661 阅读 · 0 评论 -
第二章:常量、变量、表达式
Signed 修饰 char ,int, short,long, 说明他们是有符号的整数(正整数,0,负整数),缺省都是有符号的(字符型除外),所以这个修饰常省略。4.Printf(“character:%c\ninteger:%d\nfloatint point:%f\n”,’)’,34,3.14) %c是占位符。变量一定要先定义后使用,变量表示的是存储空间,所以i=i+1,其实是将变量i的存储空间的值取出来,再加上1,得到的结果再存回i的存储空间中去。双引号是字符串字面值的界定符,\n是转义字符。原创 2017-07-14 14:58:25 · 404 阅读 · 0 评论 -
第三章:简单函数
这也是我们所说的“先声明后使用”的原则。4.在编译时gcc main.c –lm,因为数学函数位于libm.so库文件中(通常在/lib目录下),-lm选项告诉编译器,程序中要用的数学函数要到这个库文件中去找,平时我们用的绝大部分库函数位于 libc.so库文件中,使用libc中的库函数在编译时不需要加-lc,因为这个选项是gcc默认的。1.某个函数中定义的变量不能被另一个函数使用,即使在两个函数中的变量名是相同的,数值相同,但他们仍然是不同的变量,代表不同的存储空间,只不过是各自的存储空间的值是相同的。原创 2017-05-31 18:22:40 · 291 阅读 · 1 评论 -
第四章:分支语句
进入case后如果没有遇到break语句就会一直往下执行,后面其它的case或default下面的语句出会被执行到,直到遇到break,或者执行到整个switch语句块末尾,(401.c)2.在C语言中,任何可以放“语句”的地方都可以放语句块,{}后不要加;号又是一条新的语句;高于* / % 高于+ — 高于> < >= <= 高于= =!3.语句块中可以定义局部变量,每次进入语句块时为变量分配存储空间,每次退也语句块时释放变量的存储空间(405。1.掌握关系运算符和相等性运算符。原创 2017-05-31 18:20:51 · 162 阅读 · 1 评论 -
第五章:深入理解函数
3.Return的返回值与形参与实参中一样遵守C语言的传参规则,按值传递,即便返回语句写成return x,返回的也是变量X的值,而非变量X本身,因为变量X马上就要释放了。1.Return 语句的作用是提供整个函数的返回值,并结束当前函数的执行。2.Return的灵活用法 501.c。第五章:深入理解函数。原创 2017-05-31 18:20:14 · 203 阅读 · 0 评论 -
第六章:循环语句
IT基础30 内容待写原创 2017-05-31 18:19:50 · 175 阅读 · 0 评论 -
第七章:结构体
3.在601.c中,变量x和变量z的成员x的名字并不冲突,因为变量z的成员x总是用.运算符来访问的,编译器可以区分开哪个x是变量x,哪个x是变量z的成员 x,它们属于不同的命名空间,等逻辑运算符不能作用于结构体类型,if while的控制表达式的值不能是结构体类型。括号里的数据依次赋给结构体成员,但如果只是末尾多个逗号不算错,如果括号里的数据比结构体成员少,末指定的成员将用0来初始化。6.结构体类型之间用赋值运算符是允许的,用一个结构体初始化另一个结构体也是允许的。原创 2017-05-31 18:19:27 · 207 阅读 · 0 评论 -
第八章:数组
2.Scanf也可以用%c、%f、%s等转换说明,如果在传给scanf的第一个参数中用了%d、%f或%c表示读入一个整数、浮点数或字符,则第二个参数的形式应该是&运算符加一个相应类型的变量名称,表示读进来的数存在这个变量里,如果在第一个参数中用%s读入一个字符串,则第二个参数应该是数组名,数组名前面不加&,1.Char str[10] = “hello”等同于乎char str[10] = {‘h’,’e’,’l’,’l’,’o’,’\0’} 后面四个元素没有指定,自动初始化为了0,即’\0’字符。原创 2017-05-31 18:18:58 · 176 阅读 · 1 评论 -
第九章:编码风格
5.以上关于双目运算符和后缀运算符的规则不是严格要求的,有时为了突出优先级也可以写得紧凑一些,for(i=1;1.关键字if,while,for与其后的控制表达式的(括号之间插入一个空格分隔,担括号内的表达式应紧贴括号。6.由于标准的linux终端是24行80元旦,接近或大于80个字符的较长语句要折行写,折行后的空格和上面的表达式或参数对齐。2.双目运算符的两侧各插入一个空格分隔,单目运算符和操作数之间不加空格。3.后缀运算符和操作数之间不加空格,如结构体成员 s.a,函数调用 foo(arg1)原创 2017-05-31 18:18:30 · 199 阅读 · 0 评论 -
第十一章:排序与查找
从任意输入实际字符串中找出某个字母的位置并返回这个位置,如果找不到就返回-1。插入排序法采取增量式的策略解决问题,每次添一个元素到已排序的子序列,1.把长度为n的输入序列分成两个长度为n/2的子序列。3.将两个排序好的子序列合并成一个最终的排序序列。2.对这两个子序列分别采用归并排序。逐渐将整个数组排序完毕。第十一章:排序与查找。原创 2017-05-31 18:18:04 · 280 阅读 · 1 评论 -
第十二章:栈与队列
数组与堆栈区别:堆栈是一组元素的集合,类似于数组,不同之处在于,数组可以按下标随机访问,这次访问a[5]下次可以访问a[1],但是堆栈的访问规则被限制为push和pop两种操作,push(入栈或压栈)向栈顶添加元素,pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中的其它元素,如果所有元素的类型相同,堆栈的存储也可以用数组来实现。原创 2017-05-31 18:21:22 · 198 阅读 · 0 评论 -
第十四 函数接口
3.Free(p),p所指的内存空间是归还了,但是p的值并没有变,因为从free的函数接口来看根本没有改变p的值,p现在指向的内存空间已经不属于用户程序,换句话说,p成了野指针,所以应该在free(p)之后手动置p=NULL。Strcat把src所指的字符串连接到dest所指的字符后面,缓冲区s的内容没有变,缓冲区d中保存着字符串d中的内容,注意原来的’\0’ 被覆盖,而后面加上来的字符串的’\0’被保留。该函数从S所指的第一个字符开始找’\0’字符,一旦找到就返回的,返回的长度不包括’\0’字符。原创 2017-05-31 18:22:17 · 352 阅读 · 0 评论 -
第十五 内存与地址
1.每个内存单元有一个地址,内存地址是从0开始编号的整数,CPU通过地址找到相应的内存单元,取其中的指令或者读写其中的数据,一个地址所对应的内存单元不能存很多东西,只能存一个字节,以前讲过的。等多字节的数据保存在内存中要占用连续的多个地址,这种情况下数据的地址是它所占内存单元的起始地址。原创 2017-05-31 18:23:14 · 305 阅读 · 0 评论 -
关于const的具体定义
这时候p是指针常量,我们知道,指针是指向了一个数组的首地址,那么,它的位置就不可以改变了。= 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理 的,只是 ANSI C对数组的规定限制了它。//假如前面两种表达式的本质你理解了,这种表达式你来理解根本没有问题,const现在有两个,而且一个const的位置是第一种情 况的位置,第二个const是第二种情况的位置,所以这表达式的功能就是前两种情况的作用总合。原创 2017-05-31 18:24:01 · 1622 阅读 · 1 评论 -
C的设计原则是把函数作为程序的构成模块
一般情况下,把程序本身的名字赋值给argv[0],接着,把最后的第一个字符串赋给argv[1],等等。现在打开命令提示符,在命令行里运行刚才编译好的可执行文件,然后输入 echo %ERRORLEVEL% ,回车,就可以看到程序返回 一个0。比如,你把上面那个程序编译后生成的d.exe发给你的女朋友,再告诉她怎么运行,这样,你的女朋友可以用另一种方式体会到你对她的浓情蜜意。这样,打开d.c文件所在的目录,你会发现多了一个名为 love.txt 的文件,打开后里面的内容正是世界上说的最多的那句话。原创 2017-05-31 18:24:31 · 269 阅读 · 1 评论 -
makefile的基本使用方法
gcc -c file1.c -o file1.o 编译file1.o文件,-c表示用源文件名命名目标文件,默认生成file.o,可以省去-o。gcc -c file2.c -o file2.o 编译file2.o文件,-c表示用源文件名命名目标文件,默认生成file.o,可以省去-o。gobbin:file1.o file2.o gobbin为程序名称,依赖于file1.o file2.o两个目标文件。原创 2017-05-31 18:24:57 · 434 阅读 · 1 评论 -
scanf
同样,把上面的scanf换成gets,效果是一样的。(\n),在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数。如果输入的字符比较多例如10个,就会seg fault,可见scanf是不安全的,没有检查缓冲区。点评:指针需要你手动给它分配空间,并手动指向该空间如果没有,指针指向哪里,是不确定的。你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,这里是最常见的几个问题,可能还有其他的解决方法,希望和大家相互交流,能力有限有问题希望大家多多指教。原创 2017-05-31 18:17:48 · 205 阅读 · 0 评论 -
双向链表_
** 插入元素 **//** 删除元素 **//** 打印表 **//** 建表 **/删除某个结点,其实就是插入某个结点的逆操作,还是对于双向循环,要在连续三个结点。后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点。循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表。的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而。、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值。对于双向链表,我们可以随意在某个结点前或后插入一个新的结点;原创 2017-05-31 18:17:31 · 263 阅读 · 0 评论 -
判断系统大小端模式
这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。在计算机业界,Endian表示数据在存储器中的存放顺序。1,大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。原创 2017-05-31 18:17:07 · 233 阅读 · 0 评论 -
内存管理1
也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。堆是用于存放进程运行中被。原创 2017-05-16 18:29:57 · 237 阅读 · 1 评论 -
sizeof函数
计算sizeof(S1)时,min(2, sizeof(i))的值为2,所以i的偏移量为2,加上sizeof(i)等于6,能够被2整。#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,同样,对于sizeof(S3),s的偏移量为2,c2的偏移量为8,加上sizeof(c2)等。sizeof当作了求数组元素的个数是不对的,求数组元素的个数有下面两种写法:int c1 = sizeof( a1 )sizeof(MyStruct)为多少呢?原创 2017-05-16 18:29:16 · 671 阅读 · 0 评论 -
字符数组字符串常量问题
*此处的"abc"存储只读存储区,可能在DATA SEGMENT*/str1[] = "abc";/*此处的"abc"存储在栈中*/若想使用不同的常量字符串,用str5形式[/quote]若想修改字符串的内容,用str1[]形式。原创 2017-05-16 18:28:57 · 179 阅读 · 0 评论 -
在c语言中对于A=A+1,A+=1这两个函数该怎么理解
假如A的值存放在0x33445566内存地址中,那么程序先从该地址取出A的值放入寄存器X,将B放入寄存器Y(此时假设B为立即数,如果B是某个变量的话,CPU将先对其进行寻址),然后两寄存器相加结果存入寄存器X,最后将寄存器X中的结果存入0x33445566。同前假设,程序先从该地址取出A的值放入寄存器X,然后直接在寄存器X中执行自增操作,然后将寄存器X中的结果存入0x33445566。两者无论从表面上的结果或者实际代码执行过程都没有区别,但是他们和A++有一部分区别。A=A+B或者A+=B过程;原创 2017-05-16 18:28:15 · 943 阅读 · 0 评论 -
函数声明、函数定义、函数原型
这就只能叫函数声明而不能叫函数定义,只有带函数声明的才叫定义,编译器只有见到函数定义才会生成指令,而指令在程序运行时当然也是要占在存储空间的。3.编译器在处理代码的过程中,只有见到了函数原型(不管带不带函数体)之后才知道这个函数的名字,参数类型和返回值,然后碰到函数调用时才知道怎么生成相应的指令,所以函数原型必须出现在函数调用之前,这也是遵循“先声明后使用”的原则。1.void threeline(void) 声明了一个函数的名字、参数类型和个数、返回值类型,这叫做函数原型。函数声明、函数定义、函数原型。原创 2017-05-16 18:27:56 · 520 阅读 · 1 评论 -
多维数组与指针
a[0] 是第一个 一 维数组的数组名,即它是第 1 行第 1 个元素 a[0][0] 的地址,a[0]+1。*(a+1) 就是个一维数组(的数组名),而第一行的一维数组的数组名是 a[1], 所以 *(a+1)=a[1], 也即 *(a+1) 指向了数组元素 a[1][0] ,变成了一个列指针,可。都是地址,且数值是相同的,但 a 指向一维数组,而 a[0] 指向一个整型数值,它们的类型是不同的,所以 a+1 与 a[0]+1 的含义不但不同,数值也是不一样的。应特别注意的是 a,a[0]原创 2017-05-16 18:30:32 · 246 阅读 · 0 评论 -
typedef_struct用法小结
方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识。表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识。下面我展示一下如果不用。原创 2017-05-16 18:32:49 · 312 阅读 · 0 评论