C语言
可达鸭爱进步
学习运维相关技术,缓慢进步中……
展开
-
C语言——strlen(a)的值为多少
[csharp] view plain copy #include "stdio.h" #include "string.h" int main() { char a[1000]; int i; for(i=0; i { a[i] = -1-i; } printf("%d",strlen(a))转载 2016-12-09 23:32:24 · 2860 阅读 · 0 评论 -
关键字
register:为什么要声明为register变量:为了让编译器尽可能的把变量保存在CPU内部寄存器中,这样可以省去了CPU从内存里抓取数据的时间,提高了效率。为什么要说尽可能,因为CPU的内存是有限的,不可能把所有的变量都声明为register变量。什么时候声明register变量:当变量被频繁的访问时。注意事项:①只能修饰局部变量,不能修饰全局变量和函数;因为全局变量原创 2016-07-26 11:24:22 · 358 阅读 · 0 评论 -
常见的内存错误及对策
①内存分配未成功,却使用了它。②内存分配虽然成功了,但是尚未初始化就使用它。③内存分配成功并且已经初始化,但操作越过了内存的边界。④使用完忘记释放内存,造成了内存泄漏。⑤释放了内存却继续使用它。原创 2016-07-27 14:29:39 · 377 阅读 · 0 评论 -
C语言中strlen、strcpy、strncpy、strcat、strnact、strcmp、memcpy函数的实现
int mystrlen(char *src)//strlen函数 { int i; i = 0; while(*src != '\0') { src++; i++; } return i; } char *mystrcpy(char *原创 2016-09-14 22:21:04 · 855 阅读 · 0 评论 -
函数指针
函数指针顾名思义就是指向函数的指针,即保存函数地址的指针//函数int add(int a, int b);//函数指针int (*p)(int , int);//赋值//函数名即地址p = add;//整个函数的地址p = &add//两者都可以//函数指针调用函数int result = p(num1, num2);//若原创 2016-09-15 12:57:37 · 188 阅读 · 0 评论 -
数组、指针和内存管理
关于指针:一维指针保存基本变量的地址二维指针保存一维指针变量的地址三维指针保存二维指针变量的地址详解:【Linux C】浅谈指针(一) 关于传参:传一维数组名,用数组元素的指针来接传二维数组名,用一维数组的指针来接传三维数组名,用二维数组的指针来接传指针数组,用指针的指针接原创 2016-09-16 22:20:06 · 219 阅读 · 0 评论 -
函数总结
函数三要素函数名,形参和返回值函数名函数名是指针常量,他保存函数存放的地址,即函数的入口地址 命名要求:有自注释性和可读性。最多由五个下划线以及动词和单词组成。参数如何在传参的时候是传值还是传地址? 若要修改实参值,传实参地址 若只读实参值,传实参值传出参数:先前没有值,函数调用之后带出了一个值,相当于返回了一个值。 传入参数:参数原原创 2016-09-18 21:29:51 · 258 阅读 · 0 评论 -
C语言 获取字符串的方法
在C语言中,获取字符串主要有三种方法1 scanf("%s",src);这个方法很常见,遇到空格和回车结束。例:#include int main(){char src[100];scanf("%s",src);printf("%s",src);return转载 2016-09-17 12:52:55 · 8029 阅读 · 0 评论 -
复合数据类型
结构体作用:封装数据(把多种不同的数据类型放在一起)注意:一般放在全局;分号不能省略。结构体变量用点访问结构体指针用->访问初始化:静态初始化动态初始化使用注意事项:给结构体中的数组成员赋值时,不能直接将字符串赋给数组名,可以使用strcpy函数给结构体中的指针变量成员赋原创 2016-09-19 21:23:03 · 413 阅读 · 0 评论 -
左右法则
int (*func)(int *p); 首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。 int (*func)(int *p,原创 2016-09-20 21:54:43 · 252 阅读 · 0 评论 -
sizeof与strlen的区别:面试回答
示例:char *ptr = "hello world";char str[100] = "hello world";sizeof(ptr) = 4Bsizeof(str) = 100Bstrlen(ptr) = 11Bstrlen(ptr) = 11B1234567面试回答总结:我认为sizeof()与strlen()有以下几个区别。strlen是一个函数,它测量转载 2016-09-21 19:21:15 · 261 阅读 · 0 评论 -
变量作用域
#include /*全局变量: 作 用 域:当前文件中从定义的这一行,到文件结尾可用 生命周期:程序启动到程序退出*/ int w; //全局变量有默认初始值,int类型默认初始值为0 void changeW(){ w = 8; //修改全局变量 /*局部变量: 作转载 2016-10-01 20:33:33 · 234 阅读 · 0 评论 -
交换两个数的值
1.加减运算符empty2.异或运算符#include int main() { int a = 3; int b = 6; printf("a = %d\tb = %d\n", a, b); a = a ^ b; b = a ^ b; a = a ^ b;原创 2016-10-02 22:25:30 · 296 阅读 · 0 评论 -
可重入函数与不可重入函数
在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。转载 2016-10-04 21:08:06 · 242 阅读 · 0 评论 -
一维数组,二维数组,三维数组名的意义
一维数组:int a[3]; &a是数组的地址,所以&a + 1是相当于增加12个字节。*(&a) = a:对一维数组的地址取值等于数组首元素的地址。一维数组名是指针常量,是首元素的地址。二维数组:int a[5][5];*(*(a + i) + j)的解析原创 2016-07-25 17:55:19 · 1301 阅读 · 0 评论 -
C语言中体现面向对象的地方
C语言中1.实现封装的方式:用结构体来进行封装,这样便于对对象进行操作;2.实现多态:用函数指针来实现;#includeint add(int num1,int num2){ return num1 + num2;}int cal(int(*p)(int,int),int num1,int num2){ return p(num1,num2);}原创 2016-07-20 23:09:07 · 460 阅读 · 0 评论 -
容易被忽略的输入和输出
在C语言里,我们经常用scanf作为输入语句,用printf输出。那么关于输入和输出,你到底了解多少呢?一、关于“&” 首先我们来看一段程序:[objc] view plain copy#include int main() { int num;原创 2016-11-26 22:50:21 · 467 阅读 · 0 评论 -
C语言——printf函数的结合顺序
下面用一个例子来看:int arr[] = {6,7,8,9,10};int *ptr = arr;*(ptr++)+=123;printf(“ %d %d ”, *ptr, *(++ptr));分析:int *ptr = arr;此时指针指向第一个元素,即6*(ptr++)+=123;此时指针ptr自加表示地址加一,指向第二个元转载 2016-12-07 22:35:33 · 998 阅读 · 0 评论 -
七种排序算法
一、快速排序 1. 简单介绍 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需转载 2016-11-21 12:04:18 · 324 阅读 · 0 评论 -
嵌入式开发面试题
嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66.编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。典型的解决方法如下:int *ptr;ptr = (int *)0x67a9;*ptr = 0原创 2016-12-02 22:05:08 · 534 阅读 · 0 评论 -
C语言——使用scanf函数时需要注意的问题
转自:http://blog.csdn.NET/wayne92 scanf函数我曾经在这个函数上犯过不少错误,也看到别人犯过的错误,记下来,提醒自己不要重蹈覆辙了。如果对你有用,那就更好了:)如果你发现文章中有错误,欢迎你不吝赐 教。希望和大家一起学习!曾经错的几个地方:(xpsp2,vc6.0环境下)1.空白符问题[cpp] view p转载 2016-12-01 21:38:20 · 874 阅读 · 0 评论 -
如何确定CPU是大端字节序还是小端字节序?
大端字节序:高字节存放在低地址,低字节存放在高低址小端字节序:低字节存放在高低址,高字节存放在低地址大小端字节顺序它是CPU的属性,所哟不同的CPU的大小端字节顺序也不同,移植的时候需要先判断当前的CPU是大端还是小端字节序,如果不同则移植需要转移字节序int num = 0x12345678 大端转载 2016-11-30 22:06:56 · 938 阅读 · 0 评论 -
左右法则小练习
声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,则如何表示:解析:先看未定义的标识符p,p的左边是*,*p表示一个指针,跳出括号,由于[]的结合性大于*,所以*p指向一个大小为10的数组,即(*p)[10]。左边又有一个*号,修饰数组的元素,*(*p)[10]表示*p指向一个大小为10的数组,且每个数组的元素为一个指针。跳出括原创 2016-11-13 20:03:56 · 318 阅读 · 0 评论 -
详细的gcc三级优化
重新找了一下GCC 三级优化GNU编译器提供-O选项供程序优化使用: -O 提供基础级别的优化 -O2 提供更加高级的代码优化,会占用更长的编译时间 -O3 提供最高级的代码优化 -O4 不优化,这是默认值 不同的优化级别使用的优化技术也可以单独的应用于代码。 可以使用-f命令行选项引用每个 单独的优化技术。 1, 编译器优化级别1 在优化的第一个级别执行基原创 2016-11-12 10:52:32 · 1087 阅读 · 0 评论 -
GCC的编译过程
今天学习了gcc的编译过程,gcc是一个交叉平台编译器,简单的说就是,你可以在一个平台上编译出可以在另一个平台运行的代码。gcc的编译过程细分可以分成四个阶段。 一、预处理阶段 预处理阶段有三个功能 ①有文件的展开 ②宏替换③条件编译 比如你用vim编辑了一个hello.c的文件,你就可以通过输入指令gcc -E hello.c使源文件原创 2016-07-06 20:19:32 · 349 阅读 · 0 评论 -
gcc -O优化
查查gcc手册就知道了,每个编译选项都控制着不同的优化选项 下面从网络上copy过来的,真要用到这些还是推荐查阅手册 -O设置一共有五种:-O0、-O1、-O2、-O3和-Os。 除了-O0以外,每一个-O设置都会多启用几个选项,请查阅gcc手册的优化选项章节,以便了解每个-O等级启用了哪些选项及它们有何作用。 让我们来逐一考察各个优化等级: -O0:这个等级(字母“O转载 2016-07-07 10:53:36 · 375 阅读 · 0 评论 -
Linux中ELF格式文件介绍
ELF(Executable and Linkable Format)即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。与linux下的其他可执行文件(a.out,cof)相比,它对节的定义和gnu工具链对它的支持使它十分灵活,它保存的足够了系统相关信息使它能支持不同平台上的交叉编译和交叉链接,可移植性很强.同时它在执行中支持动态链接共享库。 通过本文,可以大致了解Linux系转载 2016-07-08 19:54:05 · 339 阅读 · 0 评论 -
嵌入式开发为什么选择C语言
昨天学习了C语言的概述,重点突出了内核的开发为什么要选用C语言。 首先C语言有几个语言特点决定了内核为什么选用它做开发语言。 第一点:C语言具有出色的移植性,它能够在不同的软/硬件平台上运行; 第二点:C语言能够直接访问硬件,不需要像Java那样要经过虚拟机解释才能访问硬件,所以效率也会高很多; 第三点:C语言语法灵活。相对于另外一种可以直接访问硬件的语言——汇编语原创 2016-07-11 09:38:09 · 807 阅读 · 0 评论 -
运算符
运算符i++和++i的区别i++是先执行后自加,后自加是指遇到结束标志后自加。C语言里面的结束标志有逗号、分号和函数的括号。下面有几个例子可以让我们来看看++i和i++是怎么运行的:1.int i = 2; i = (i++) + (i++) + (i++) + (i++);2.int i = 2; i = (++i) + (++i) + (++i) + (++i);3. in原创 2016-07-16 09:04:18 · 467 阅读 · 0 评论 -
内联函数
一、什么叫inline函数? inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间)。这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入转载 2016-10-05 21:34:03 · 323 阅读 · 0 评论 -
单链表倒序
#include typedef struct Node { char data; struct Node* next; } Node; void print_list(Node* root) { while (root) { printf("%c ", root->data); root = root-转载 2016-10-06 22:05:36 · 455 阅读 · 0 评论 -
关于共用体
生活中有很多这样的例子,比如在校教师和学生填写表格,在职业一项分别填教师和学生,而单位一项学生应该填入班级编号,教师应该填写某教研室,班级可以用整型变量表示,教研室只能用字符型变量,因此就必须把“单位”定义为包含整型和字符型两种类型的联合型。这种有几种不同类型的变量占用同一段内存空间的结构称为共用体。共用体和结构体有一些相似的地方,但两者有本质的不同。结构体中各成员有各自的内存空间,一个结原创 2016-10-27 20:16:55 · 448 阅读 · 0 评论 -
运算符
tips:1、== 是判断相等的符号,但是有的时候会不慎写成=,这个时候编译的时候不会报错,但是这个语句就不会形成约束条件,这个条件下的语句会无条件执行。所以一般将数字写在左边,表达式写在右边,这样万一写错的话就会报错。2、&&是短路与,一旦前面的表达式错了,就不会执行后面的表达式。 3、||是短路或,一旦前面的表达式对了,就不会执行后面的表达式。 如int i = 0转载 2016-10-28 22:59:53 · 258 阅读 · 0 评论 -
数组名和数组指针
将一个字符数组进行遍历: while(*src !='\0') { src++; } 这里的数组名用法和指针的用法基本差不多,但是它们还是有区别的。比如数组名不能成为赋值符号的左值, 姑且认为它只是一个指针的常量吧!(有人写过一些证明,说数组名在内存空间没有空间,认为这是一个符号。) 数组名代表的是这个数组的首元素的地址(任何元素,包括一维数组)原创 2016-10-29 22:40:37 · 390 阅读 · 0 评论 -
c语言格式化输出函数printf()
printf()函数的使用: printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。调用格式为: printf("",); 其中格式化字符串包括两部分内容: 一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数,原创 2016-10-30 22:18:00 · 638 阅读 · 0 评论 -
【Linux C】scanf和Linux C中的gets函数警告
在C语言中,字符数组的输入有两种方法: ①逐个字符输入 ②一次性输入整个字符串1.逐个字符输入 使用“%c”,例如: 2.一次性输入整个字符串 使用“%s”,例如: 需要注意的是,在这里定义的str数组的长度为10,则输入的字符串的长度应小于定义的长度10.若输入hello,则系统自动在输入的hello后面加一个’\0’转载 2016-10-31 23:10:31 · 1297 阅读 · 0 评论 -
C语言文件概述
众所周知,数据存储是计算机的主要功能之一,各种数据包括文章,图像,数据库等都以二进制的形式存放在磁盘,磁带,光盘等外部介质上。当然,这些数据不可能无序地存放在外部介质上,计算机系统将相关的数据以集合的形式进行存储,并引入了文件的概念。因此,文件就是指存储在外部介质上的相关数据集合。文件中的数据是需要进行存取和处理的,一般对文件的操作可以通过以下两种方式进行:文件操作命令和文件系统功能调用。原创 2016-11-01 21:23:33 · 2509 阅读 · 0 评论 -
关于C语言的一些标准
C语言的标准有哪些?从C语言问世至今,我们通常认为的C语言标准是指:K&RC、C89、C99、C111.K&RC 1978年,丹尼斯•里奇(Dennis Ritchie)和布莱恩•柯林汉(Brian Kernighan)合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程式设计师称作“K&R C”,第二版的原创 2016-11-03 21:26:12 · 762 阅读 · 0 评论 -
单链表
对于单链表,由于每个结点只存储了向后的指针,到了尾标志就停止了向后的操作,这样,当某一个结点找不到前驱结点了,也不能回去找。而我们现在要解决这个问题,就要利用循环链表。 将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。 循环链表解决了一个很麻烦的问题:如何从一个结点出发,访问到转载 2016-11-04 23:43:49 · 395 阅读 · 0 评论 -
C语言的快速排序算法
一、快速排序算法(Quicksort)基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。3. 步骤a. 先从数列中取出一个数作为基准数。b. 分区过程,将比这个数大的数全放到它的右边,小于或等于转载 2016-11-06 22:17:54 · 303 阅读 · 0 评论