C语言
文章平均质量分 63
jxm_96
学Linux,刚开始起步,C语言走起(*^__^*) 嘻嘻……
展开
-
Linux C第一课
一、现代社会,当我们程序猿拿到一部智能设备,心里在想什么呢?当然是这个智能设备是由什么组成的啦。智能设备的组成包括它的硬件平台和软件平台。硬件平台就是指CPU,CPU有很多系列,常见的有51单片机,avr,ARM,mips,PowerPC等,其中ARM又分为ARM7(stm32),ARM9(2440,2451),ARM11(6410三星),和cotex-A系列;x86又分为386和486。软件平台就原创 2016-07-09 10:59:04 · 426 阅读 · 0 评论 -
文章标题struct对齐方式
//用一个宏定义FIND求结构体struct s中某个成员变量member相对struct s的偏移量. //思考:若struct s的地址为0,则其成员member的地址就是其相对于s的偏移量 //扩展: <1>sizeof(struct s) 不一定等于 sizeof(struct s中的每一个成员)的和 // <2>结构体大小不仅由成员的大小决定(sizeof(member))转载 2016-12-14 13:33:05 · 338 阅读 · 0 评论 -
C语言中,malloc和free深入理解
在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用—— 就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以 写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助! 如果不扯原创 2016-11-25 19:53:49 · 325 阅读 · 0 评论 -
union 和 struct
联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量。联合说明和联合变量定义与结构十分相似。其形式为: union 联合名{ 数据类型 成员名; 数据类型 成员名; … } 联合变量名; 联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。下例表示说明一个联合a_bc:union a_bc {原创 2016-12-13 21:24:38 · 308 阅读 · 0 评论 -
C和C++中struct和typedef struct的异同
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是s转载 2016-11-24 20:15:54 · 363 阅读 · 0 评论 -
线性表之顺序存储结构(C语言动态数组实现)
线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3….an)链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组。是的,数组就是一种典原创 2016-12-04 22:31:17 · 484 阅读 · 0 评论 -
测试题(2)
1、内存的分配方式的分配方式有几种?(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3)从堆上分配,亦称动态内存分配。动态内存的原创 2016-12-03 18:37:49 · 287 阅读 · 0 评论 -
如何判断CPU是大端存放还是小端存放
大端字节序:高字节存放在低地址,低字节存放在高低址 小端字节序:低字节存放在高低址,高字节存放在低地址 大小端字节顺序它是CPU的属性,所哟不同的CPU的大小端字节顺序也不同,移植的时候需要先判断当前的CPU是大端还是小端字节序,如果不同则移植需要转移字节序int num = 0x12345678 大端 小端原创 2016-12-02 21:52:25 · 366 阅读 · 0 评论 -
使用scanf的注意事项
scanf函数我曾经在这个函数上犯过不少错误,也看到别人犯过的错误,记下来,提醒自己不要重蹈覆辙了。如果对你有用,那就更好了:)如果你发现文章中有错误,欢迎你不吝赐 教。希望和大家一起学习!曾经错的几个地方:(xpsp2,vc6.0环境下)1.空白符问题#include<stdio.h> void main() { int a; printf("input the原创 2016-12-01 22:43:34 · 705 阅读 · 0 评论 -
数组与链表的区别
1.基于空间的考虑 数组的存储空间是静态,连续分布的,估计过大造成空间浪费,估计太小又将使空间溢出机会增多。 而链表的存储空间是动态分布的,只要内存空间尚有空闲,就不会产生溢出; 链表中每个节点除了数据域外,还有指针域,存储密度小于1 (数组为1), 存储空间利用率就越高。 2. 基于时间的考虑 数组中任意节点都可以在O(1) 内直接存储访问,而链表中的节点,需从头指针顺着链表扫描才能取转载 2016-12-21 13:21:13 · 312 阅读 · 0 评论 -
斐波那契数列及青蛙跳台阶问题
题目1: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契(Fibonacci)数列定义如下: f(n)= ⎧ ⎩ ⎨ ⎪ ⎪ 0, 1, f(n−1)+f(n−2), n=0 n=1 n>2效率很低的解法: 递归解法(效率很低) [objc] view plain copylong long Fibonacci_Solution1(uns原创 2016-12-21 13:34:55 · 502 阅读 · 0 评论 -
不使用循环,判断一个数是否是2的N次方
对于判断一个数是否为2的N次方问题,通常想到的最为直接的办法就是对这个数不断对2取余,为0就将该数变为该数除以2,直到最后该数为1为止。 void judge(int n) { while(!(n % 2)) { n = n / 2; if(n == 1) { printf("yes!\n); return; }原创 2016-12-25 23:09:36 · 612 阅读 · 0 评论 -
堆(heap)和栈(stack)有什么区别?
简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、原创 2016-12-24 21:32:51 · 494 阅读 · 0 评论 -
静态库和动态库的区别
静态库与动态库的区别? 静态库: 之所以称为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。 (1)静态库对函数库的链接是放在编译时期完成的。程序在运行时与函数库再无瓜葛,移植方便。 (2)它比较浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。 (3)另一个问题是静态库对转载 2016-12-18 16:16:41 · 315 阅读 · 0 评论 -
远指针和近指针,巨指针
char near p; /定义一个字符型“近”指针*/ char far p; /定义一个字符型“远”指针*/ char huge p; /定义一个字符型“巨”指针*/首先要从8086处理器体系结构和汇编渊源讲起。大家知道,8086是一个16位处理器,它设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;S转载 2016-12-18 16:14:03 · 332 阅读 · 0 评论 -
C语言左右法则
C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:The right - left rule: Start reading t转载 2016-12-23 23:31:27 · 396 阅读 · 0 评论 -
strcpy,sprintf,memcpy的区别
strcpy 函数操作的对象是字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。 sprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。 memcpy 函数顾名思义就是 内存拷贝,实原创 2016-12-23 23:27:44 · 337 阅读 · 0 评论 -
c语言数组与指针详解
好多同学都说:“老师,我看到指针就晕!”,说实话,见过晕血的,见过晕车的,晕指针的到是第一次听说! 我们先来分析一下晕车的原理,再来对比一下为什么晕指针。 晕车,是因为耳朵里的一个器官对外界的振动太敏感,导致身体调节功能紊乱,系统不能正常工作,轻则,晕点,中则,吐点,重则,“重启”(倒地)。时间长了,知道自己晕车,于是,看到公交车,TAXI,火车,自行车,都晕!这样的病就大了,上转载 2016-12-15 17:07:46 · 357 阅读 · 0 评论 -
密码的输入带*号,可删除
#include <stdio.h>int main(){ char mima[10]={0},i=0; printf("请输入密码:"); while(1) { mima[i]=getch(); switch(mima[i]) { case '\b'://原创 2016-11-15 21:31:10 · 421 阅读 · 0 评论 -
实现常用字符串函数的功能
在现在的Linux版本下,支持许多的API函数,平时我们用得是挺舒服的,但是我们不光要用API函数,更重要的是,我们要知道这些API函数是怎样工作,执行的。我就用字符串的几个重要的函数来举例 一:字符串比较函数strcmp();#include <stdio.h> #define MAX_SIZE 1024 int my_strcmp(charchar *dest, charchar原创 2016-11-18 21:00:24 · 353 阅读 · 0 评论 -
C语言中,malloc和free深入理解
在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用—— 就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以 写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助! 如果不扯原创 2016-11-30 19:18:08 · 313 阅读 · 0 评论 -
Linux C第三课
一、为什么嵌入式开发中选择C语言作为开发语言 1.C语言的特点 ①C语言具有出色的可移植性,能够在不同体系结构软/硬件平台上运行,所谓移植性好,就是当程序应用于不同的平台时,需要修改的源码少 ②C语言具有简练紧凑,使用灵活的语法机制,并且能直接访问硬件 ③C语言具有很高的运行效率 2.C语言与汇编语言的选择 ①C语言是高级语言,能实现一些复杂的功能,主要用于对硬件原创 2016-07-11 15:11:51 · 433 阅读 · 0 评论 -
Linux C 第四课
一、字符串的输入与输出 1.保存字符串要用数组 2.‘0’即‘\0’ 3.C语言自定了函数 atoi();功能:将数字字符串转化成相应的数字;遇到非数字的字符即停止;可以判断正负 4.将数字字符转化成相应的数字 :str[i] - ‘0’;(str[] 是保存字符串的数组) 5.数字转换成相应字符串的方法:num + ‘0’ 6.获取字符串的三种方法 #include<stdio.h>i原创 2016-07-14 16:47:19 · 346 阅读 · 0 评论 -
Linux C 第五课
*书写定义宏用大写 *数组名是常量,代表数组的地址,存储数组的地址 *if(6 == num) // 使用 == 是将常数写在等号左边 { … } *if(),while(),for() 括号后面都不可以加 ; *逻辑运算符 ① && 短路与 当符号左边为 0 时,结果为0,后面的不计算 ② ||短路非 当符号左边为1时,结果为1,后面的不计算原创 2016-07-16 16:00:57 · 372 阅读 · 0 评论 -
Linux 第六课
如何避免野指针1.当我们定义一个指针时,如果这个指针没有指向,要置空//#define NULL (void *)0char *p = NULL;对指针置空,有利于提醒我们不对零地址操作,另外,当出运行出现段错误时方便检查是否对零地址操作。零地址:不可以进行复制操作,也不可以对零地址内的值进行修改。初始化为零地址(NULL),让我们形成条件反射,不能对零地址进行操作2.在使用指针之前要检查指针是原创 2016-07-18 20:58:24 · 449 阅读 · 0 评论 -
malloc、realloc、calloc
malloc1.函数原型 void *malloc(size_t size); 2.功能 malloc()在内存的动态存储区中分配一块长度为size字节的连续区域。参数size为需要的内存空间的长度,返回该区域的地址calloc1.函数原型 void *calloc(size_t nmemb, size_t size); 2.函数功能 calloc()与malloc相似,参数size为申原创 2016-07-19 22:07:13 · 443 阅读 · 0 评论 -
Linux C第七课
指针与数组的区别1.从空间分配来说,数组是静态分配,指针式动态分配。 2.从访问效率来说,数组是直接访问,访问效率高;指针是间接访问,效率低。 3.从安全性来说,操作不当时数组会造成越界,野指针会造成内存泄漏。 4.从函数形参来说,传一维数组用元素指针,传二维数组用一维数组指针,以此类推;传指针用指针的指针。 5.从处理对象来说,数组偏向于值的处理,指针偏向于计算机地址的处理。 6.从空间原创 2016-07-21 11:11:52 · 253 阅读 · 0 评论 -
如何写出优质程序(1)--排版
如今小编是个超级小菜鸟,常常为了一个功能的程序烦好久,但是这并不妨碍想要成为一名能写出优质程序的程序媛的决心。下面小编来总结一下,如何才能写出优质程序呢?排版1.程序块要采用缩进风格编写,缩进的空格数为4个。对齐只使用空格键,不使用TAB键。函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。程序块的分界符(如C/C++语言的大括原创 2016-07-21 15:07:29 · 1180 阅读 · 0 评论 -
Linux C 第八课
关键字register register的作用是请求编译器尽可能将变量保存在CPU的内部寄存器中,这样做的好处是省去了CPU从内存中读取数据的时间,从而提高了程序的运行效率。通常情况下,我们将频繁被访问的变量设置为寄存器变量。使用register关键字要注意一下几点:一、register只能修饰局部变量不能修饰全局变量,因为全局变量可以被多个进程访问,如果设为register变量,只有当前进程知道原创 2016-07-25 15:29:23 · 406 阅读 · 0 评论 -
Linux C第二课
gdb 调试器 一、gdb 调试器的三大功能 - 启动被调试程序 - 在执行可执行文件时可以打断 - 检查程序的中断值 二、gdb的使用 gcc -g demo.c -o demo gdb demo (gdb) run //用来显示程序的运行结果 (gdb) list //显示程序及行号 (gdb) break 20 //在某一行设置断点 (gdb) break 20 i原创 2016-07-09 16:26:43 · 284 阅读 · 0 评论 -
Linux中.c文件到可执行文件的坎坷历程
简单来说,我们从源文件到可执行文件要经历四大阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。在Linux中,程序员可以根据自己的需要让GCC在编译的任何阶段结束,并生成相应的文件此处以hello.c作为例子#includeint main()#include{ printf("hello world!\n"); return 0;}1.预处理阶段:对以#开头的语句进行处理原创 2016-07-06 18:59:37 · 324 阅读 · 0 评论 -
测量各种数据类型的长度(包括指针),typedf关键字对数据类型的作用!
32位处理器存储单位 bit (位) 字节 = 8 bit 半字 = 2 个字节 = 16 bit 字 = 4 个字节 = 32 bit 字节长度: 变量在内存中所占的存储空间的长度 数据类型 字节长度 char 1 short 2原创 2016-11-29 19:08:41 · 403 阅读 · 0 评论 -
容易被忽略的输入和输出
在C语言里,我们经常用scanf作为输入语句,用printf输出。那么关于输入和输出,你到底了解多少呢?一、关于“&” 首先我们来看一容易被忽略的输入和输出#include原创 2016-11-27 00:13:35 · 362 阅读 · 0 评论 -
有关函数声明的注意点
在C语言中,函数声明称为函数原型(function prototype)。使用函数原型是ANSI C的一个重要特点。它的作用主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。说明: <1> 以前的C版本的函数声明方式不是采用函数原型,而只是声明函数名和函数类型。 如:float add(); 不包括参数类型和参数个数。系统不检查参数类型和参数个数。新版本也兼容这种用法,但不提倡这种原创 2016-11-28 17:39:35 · 601 阅读 · 0 评论 -
七种排序算法
一、快速排序 1. 简单介绍 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的原创 2016-11-09 19:12:22 · 301 阅读 · 0 评论 -
傲娇的可执行文件类型——ELF
ELF(Executable and Linkable Format)即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。与linux下的其他可执行文件(a.out,cof)相比,它对节的定义和gnu工具链对它的支持使它十分灵活,它保存的足够了系统相关信息使它能支持不同平台上的交叉编译和交叉链接,可移植性很强.同时它在执行中支持动态链接共享库。 通过本文,可以大致了解Linux系转载 2016-07-08 20:31:34 · 526 阅读 · 0 评论 -
gcc的优化选项
gcc的优化选项:用于对目标文件进行优化,常用选项有-o1 --对目标文件的性能进行优化 一级优化-o2 --在-o1的基础上进行优化 二级优化-o3 --在-o2的基础上进行优化 三级优化-o0 --不进行优化,默认的编译选项1.-o和-o1 --对程序部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。使用本项优化,原创 2016-07-06 20:26:11 · 750 阅读 · 0 评论 -
怎么替换字符串中的空格君?
//替换字符串中的所有空格为%20#include#include#includevoid replace(char *str,char *ss){ int i = 0;int j = -1;int n1 = strlen(str);int n2 = strlen(ss);char *tmp = (char*)malloc(sizeof(char) * n1 * 2);while(i < n1 &原创 2016-07-07 19:50:46 · 380 阅读 · 0 评论 -
欢迎使用CSDN-markdown编辑器
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl转载 2016-07-07 19:53:21 · 350 阅读 · 0 评论 -
shell编程(1)
什么是shell1.shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止,甚至编写一些程序。 2.用户使用Linux时是通过命令来完成所需工作的。一个命令就是用户和shell之间对话的基本单位,它是由多个字符组成并以换行结束的字符串。几种流行的shell1.目前流行的shell有ash、bash、ksh、cs原创 2016-09-20 13:56:50 · 238 阅读 · 0 评论