the long way of C language
文章平均质量分 79
橙子cmr
一只还在学习的菜鸟
展开
-
c面试试卷
1、请写出 float x 与“零值”比较的 if 语句 if(x>=0.000001&&x<=-0.000001) 2、写出输出结果 AAA,段错误 char* s = “AAA”; printf(“%s”, s); s[0] = ‘B’; printf(“%s”, s); 解析:指针变量是全局变量,对应的是内存中的全局区域。字符串常量保存在只读的数据段,是不可以修改的3、原创 2016-12-20 22:09:39 · 373 阅读 · 0 评论 -
《c和指针》(六)
一、结构的声明 1、两个无名结构体声明的结构体变量类型不相同,不可以直接相互赋值。例如: struct { int a; char b; float c; } x;struct { int a; char b; float原创 2016-09-25 19:25:24 · 244 阅读 · 0 评论 -
《c和指针》(五)
一、向一个有序单链表中插入数据 参数说明:proot :单链表的根指针,注意仅仅是一个指针,不包含数据,指向单链表的第一个结点(第一个包含数据的结点) value :待插入的数据 struct node { struct node *link;原创 2016-09-24 16:40:29 · 191 阅读 · 0 评论 -
《c和指针》(二)
一、char类型有无符号取决于编译器的实现 在linux gcc下测试发现gcc编译器将char类型实现为了有符号的,范围为-128~127。arm-linux-gcc将char实现为了无符号的,范围0~255。mipsel-linux-gcc将char实现为有符号的,范围-128~127。测试方法:定义一个char类型变量,并且用一个最高位为1的字面值常量将其初始化,然后比较该变量和该字面值常量转载 2016-09-21 14:15:42 · 256 阅读 · 0 评论 -
《c和指针》(一)
一、ANSI C标准之“三字母词” 三字母词就是三个字符的序列合起来表示另一个字符。ANSI标准并没有规定C环境使用的字符集,但是C编译器所使用的字符集必须包括某些特定的字符,如果你使用的字符集缺少某些字符,可以使用三字母词替代。三字母词以两个“?”开头,后面再接一个字符,例如 : ??( [ ??) ] ??< { ??> } ??/ \转载 2016-09-20 19:21:48 · 234 阅读 · 0 评论 -
《c和指针》(四)
一、字符串长度 1、标准库函数:size_t strlen(char const *string) ; 头文件:string.h, size_t 定义在stddef.h中,是无符号整型。 2、字符串长度的比较: 方案一: if (strlen(x) >= strlen(y)) { ………………转载 2016-09-23 20:50:12 · 218 阅读 · 0 评论 -
《c和指针》(三)
一、数组名1、一个误区:数组名并不表示整个数组,它大多时候只是一个指针常量,指向数组的第一个元素,它的类型取决于数组元素类型。这一点解释了为什么C语言的数组不能整体拷贝,只能循环拷贝赋值。如果你将数组名赋值给另一个数组名,例如,int a[10] ; intb[10]; a = b; ,就已经错的一塌糊涂:1)数组名是一个常量指针,它不可以被赋值;2)就是上面提到的数组不能整体拷贝,因为你得到转载 2016-09-22 20:03:05 · 248 阅读 · 0 评论 -
数组排序法(二)
(4)“插入法”插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。void insert(int *a,int n){int i,j,temp;for(i = 1;i < n ;i ++) {temp=a[i ]; /temp为要插入的元素/j=i-1;while(j >= 0&&temp < a[j]) { /从a[i转载 2016-09-19 18:27:50 · 277 阅读 · 0 评论 -
extern关键字的作用
用一句很贴切的话来形容我们的extern关键字就是“外来的和尚会念经”extern 是指当前变量或函数不是本源文件内声明的,它是外部变量和外部函数,正所谓“外来的和尚会念经”,能够很好的体现extern的价值。当我们在本文件中试图引用一个外部声明的全局变量或者函数的时候,可以在其前面加上extern,表示它是外来的“和尚”extern 可以修饰变量和函数,表示该变量或函数在其他的地方被定义(本源文件原创 2016-08-15 14:41:12 · 1042 阅读 · 0 评论 -
数组排序法(一)
让我们先定义一个整型数组a[n],下面用五种方法对其从小到大排序。(1)“冒泡法”冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i ],则交换它们,一直比较到a[n]。同理对a[1],a[2],…a[n-1]处理,即完成排序。下面列出其代码:void bubble(int a,int n) /定义两个参数:数组首地址与数组大小*/{int i,j,temp;原创 2016-09-18 19:19:55 · 332 阅读 · 0 评论 -
数组溢出
c问题—关于数组溢出的思考今天在做题时,发现定义整型数组a[10],并赋初值,然后我访问a[11],输出0,再a[11]=3后访问a[11],输出3,a的长度还是10,那么a[11]存在哪里了?首先,声明了int型数组a[10]的话,可知a指针指向RAM中一个区域,其后 10 x sizeof(int) 的区间就是数组a分配的空间。那么问题来了,如果我们访问 a + 11 x sizeof(int)原创 2016-09-17 10:44:54 · 520 阅读 · 0 评论 -
《c和指针》(七)
一、二级指针 1、二级指针是指向指针的指针。一个二级指针变量存储的是一个一级指针的地址,即它指向一个一级指针; 2、对二级指针变量进行一次间接访问就是访问该二级指针变量指向的那个一级指针。如果对二级指针的间接访问作为左值,则访问的是一级指针的内存地址,即会改变一级指针的指向;如果对二级指针的间接访问作为右值,则访问的是一级指针变量存储的地址值,即一级指针指向的地址; 3、对二级指针进行两次间接转载 2016-09-26 21:33:41 · 232 阅读 · 0 评论 -
堆和栈的总结
堆和栈的概念 堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。要点:堆,队列优先,先进先出(FIFO—first in first out)。栈,先进后出(FILO—First-In/Last-Out)。 堆栈空间分配 栈(操作系统):由操作系统自动分配释转载 2016-10-23 22:47:47 · 252 阅读 · 0 评论 -
c面试试卷
下面字符串定义错误的是( A ) A. char p[5] = “hello”; B. char p[] = “hello”; C. char p[] = {‘h’ , ’e’ , ’l’ , ’l’ , ’o’}; D. char *p = “hello”; 解析:字符串需要包括字符串结束标识符’\0’,”hello”算上\0之后是6个字符,超出了定义的范围大小。设char s原创 2016-12-18 18:08:37 · 448 阅读 · 0 评论 -
c面试试卷3.0
1、请写出输出结果 4294967285,-128 unsigned short A = 10; printf(“~A = %u\n”, ~A); char c=128; printf(“c=%d\n”,c); 解析:~A =0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285 第二题,c=0x10,输出的是int,最高位为1原创 2016-12-23 23:44:44 · 401 阅读 · 0 评论 -
银行家算法
*banker.h*///#include < stdio.h >//系统中进程的数量 //#define PRO_NUM 5typedef struct{ int A; int B; int C; int D; }RESOURCE;//最大需求矩阵 RESOURCE max_need[PRO_NUM] = { {0,1,4,4},原创 2017-01-02 22:10:16 · 657 阅读 · 0 评论 -
网络编程基础知识1.0
1、四层/七层网络模型 2、五类ip范围 IP地址 = {<网络号>, <主机号>}A类地址 : 0.0.0.0 ~ 127.0.0.0 B类地址 : 128.0.0.0 ~ 191.255.0.0 C类地址 : 192.0.0.0 ~ 223.255.255.0 D类地址:224.0.0.0 ~ 239.255.255.255 E类地址:240.0.0.0 ~ 247.255.255.原创 2016-12-05 17:24:01 · 267 阅读 · 0 评论 -
C语言面试试卷
一、填空选择题 1、请写出 char *p 与“零值”比较的 if 语句 if(NULL == p) 2、写出打印结果255 #include < stdio.h> #include < string.h> int main() { char a[1000]; int i; for(i=0;i<1000;i++) {转载 2016-12-03 15:07:02 · 535 阅读 · 0 评论 -
字符串格式化 sprintf 2.0
四、连接字符串sprintf 的格式控制串中既然可以插入各种东西,并最终把它们”连成一串”,自然也就能够连接字符串,从而在许多场合可以替代strcat,但sprintf 能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。比如: char* who = “I”; char* whom = “CSDN”; sprintf(s, “%s love %s.”, who, w转载 2016-11-09 19:47:44 · 310 阅读 · 0 评论 -
数据校验方法(有待整理)
1.什么是数据校验 通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 2.最简单的检验 实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。 适用范围:简单的数据量极小的通讯。 3.奇偶校验Parity Ch转载 2016-11-05 20:53:12 · 7701 阅读 · 2 评论 -
《c和指针》(九)
一、C语言表达式语句 C语言并不存在专门的赋值语句,C语言的赋值和加、减法一样是一种操作,操作在表达式内完成。赋值操作符为“=”。例如:x = y + 3 ; 是一个表达式语句,而不是一个赋值语句。理解这一点特别重要,因为像 y + 3; 这样的表达式语句也是合法的。 二、C语言的while、do循环语句 和 for循环语句转载 2016-09-28 19:23:17 · 205 阅读 · 0 评论 -
左值右值
什么是左值(lvaule)?左值是指可以被赋值的表达式。左值位于赋值语句的左侧,与其相对的右值(rvaule,见 1.11)则位于赋值语句的右侧。每条赋值语句都必须有一个左值和一个右值。左值必须是内存中一个可存储的变量,而不能是一个常量。下面给出了一些左值的例子:int x; int *p_int; x=1; *p_int=5;变量x是一个整数,它对应于内存中的一个可存储位置,因此,在语句“x转载 2016-11-04 20:14:52 · 367 阅读 · 0 评论 -
《c和指针》(八)
一、char类型有无符号取决于编译器的实现 (受本科时一本教材的影响,我以前一直以为char就是有符号的,只是省略了signed而已)。我在linux gcc下测试发现gcc编译器将char类型实现为了有符号的,范围为-128~127。arm-linux-gcc将char实现为了无符号的,范围0~255。mipsel-linux-gcc将char实现为有符号的,范围-128~127。测试方法:定义原创 2016-09-27 21:36:06 · 199 阅读 · 0 评论 -
指针函数和函数指针
指针函数和函数指针有什么区别1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示:返回类型标识符 *返回名称(形式参数表) { 函数体 }返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一原创 2016-09-16 19:42:15 · 221 阅读 · 0 评论 -
关于约瑟夫环的思考(三) c++
方法2:循环队列,将未访问的数据移动到循环队列末尾 #define MaxCount 1000 void RoundQueue(void) { int list[2*MaxCount]; //多分配一倍的空间,用来放循环数据 int i,index = 0,tail,delcount = 0转载 2016-09-15 23:15:27 · 597 阅读 · 0 评论 -
开始
第一天开启自己的博客,没有什么特别的目的,只为了记录自己学习的足迹。 本人目前大二党,正在学习计算机嵌入式培养的专业。 qq:909026330 wx:zc15850681995 大概就这样吧。原创 2016-06-04 16:14:42 · 294 阅读 · 0 评论 -
目录一
申明:这是所报培训班授课内容加个人学习总结所得 一、C语言概述 1、C语言之父是谁? 答:丹尼斯·里奇。 链接为百度百科: http://baike.baidu.com/link?url=HhatxDUjLyVYtDb5XzT7fFW0cWc2mG6nLHSoa-vjB3WJRYcHm7jjEn0SXz3Q9vFJZNR9pIQGmNs92_RxabJSRq 拓展:面试第一个问题有可能为原创 2016-06-04 16:42:58 · 390 阅读 · 0 评论 -
编译的细分————
编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言(目标文件),并且按照操作系统对可执行文件格式的要求链接生成可执行程序。 过程:c文件–>预处理-->编译-->汇编-->链接–>可执行文件 1.gcc -E test.c -o test.i 生成.i文件 编译预处理读取c源程序,对其中的伪指令(以#开头的指令)原创 2016-07-06 20:12:48 · 343 阅读 · 0 评论 -
几个重要的库函数strpcy\strncpy\memcpy……
strcpy strcpy函数的原型是: char * strcpy(char* dest, const char* src) strcpy的实现经常要注意的细节是: (1)判断地址是否为空,个人感觉可以使用断言 (2)参数只有两个地址,没有拷贝的长度。拷贝到’\0‘时就会终止,要保证最终dest末尾是’\0’。 (3)要保证目标字串的长度足够,能够容纳原串的长度。 (4)因为拷贝是d原创 2016-07-16 20:58:28 · 1011 阅读 · 0 评论 -
关于函数声明
今天在写趣味一百题的时候,注意到答案是这样的发现主函数中有这么一句话:void f();一开始的时候竟然没有意识到这是函数声明,还在吐槽这个程序没有声明函数……才发现自己对函数声明这一块没有重视…… 在C语言中,函数声明称为函数原型(function prototype)。使用函数原型是ANSI C的一个重要特点。它的作用主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。 说明:原创 2016-07-27 09:56:07 · 591 阅读 · 0 评论 -
小数的二进制表示
正小数的二进制表示 比如说5.6整数部分5用2进制为101小数部分0.6 有这样一个公式: *2 如果<1就为0,基数=基数;大于1,就为1,基数=基数-1 0.6*2=1.2>0 那么就为1 基数=1.2-1=0.20.2*2=0.4<0 那么就为0,基数=0.40.4*2=0.8<0,那么就为0,基数=0.80.8*2=1.6>0 那么就为1,基数为1.6-1=0.6::::所以5.6可以表示原创 2016-07-14 15:35:33 · 2295 阅读 · 0 评论 -
malloc calloc realloc的函数原型和功能
malloc1.函数原型 void *malloc(size_t size); 2.功能 malloc()在内存的动态存储区中分配一块长度为size字节的连续区域。参数size为需要的内存空间的长度,返回该区域的地址calloc1.函数原型 void *calloc(size_t nmemb, size_t size); 2.函数功能 calloc()与mal原创 2016-07-25 19:30:02 · 1433 阅读 · 0 评论 -
printf&scanf的使用注意事项
1、 格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。但和printf()函数中格式字符串的用法有一些小区别。可查c primer plus 的68页以及79页。scanf:注意事项 (1) 对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上”&”操作符。 (2)原创 2016-07-14 09:35:06 · 1517 阅读 · 0 评论 -
C语言的标准
K&R C 1978年,丹尼斯•里奇(Dennis Ritchie)和布莱恩•柯林汉(Brian Kernighan)合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程式设计师称作“K&R C”,第二版的书中也包含了一些ANSI C的标准。K&R C主要介绍了以下特色: • 结构(struct)类型 • 长整数(long int)类型 •转载 2016-07-11 17:27:27 · 370 阅读 · 0 评论 -
面向过程处理机制VS面向对象处理机制
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 C++对C的扩展Cute:封装,多态,继承,类,模版,STL泛型编程。 面向过程一种以事件为中心的编程思想,以功能(行为)为导向,按模块化的设计,就是分析出转载 2016-07-11 15:40:01 · 417 阅读 · 0 评论 -
GCC 优化选项(1)
找到英文版的了,很尴尬;-O' -O1’ Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a la·rge function. With `-O', the compiler tries to reduce code size and executio转载 2016-07-06 20:40:34 · 396 阅读 · 0 评论 -
GCC优化选项(2)
相关博客http://blog.chinaunix.net/uid-24954950-id-2956476.html 相关博客http://blog.csdn.net/misiter/article/details/7514428 相关博客http://blog.chinaunix.net/uid-23916171-id-2653114.html Gcc 编译优化简介 gcc 提供了为了满足用转载 2016-07-07 19:45:02 · 632 阅读 · 0 评论 -
关于约瑟夫环的思考(二) c++
数组方式二:两重while循环,将间隔计数的直接写成了程序,未用循环,这样移植性差了//#define SIZE 1000 //#define STEP 2 //#define DELFLAG (SIZE + 1)void ArrayTest2(void) { int arr[SIZE]; for (int i=0;i < SIZE;++i) arr[i]=i; // 实际情转载 2016-09-14 13:15:07 · 360 阅读 · 0 评论 -
关于约瑟夫环的思考(一) c++
题目: “约瑟夫环:每隔两个循环删除数组元素,求最后删除者的下标问题” 有一个数组a[1000]存放0–1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置(原来的数可能是无序的,另外数是否重复从题意无法确定)。 以8个数为例: {0,1,2,3,4,5,6,7} 0–>1–>2(删除)–>3–>4–>5(删除)–>6–>7–>0(删除),转载 2016-09-13 16:51:54 · 1194 阅读 · 0 评论 -
关于数组溢出的思考
c问题—关于数组溢出的思考今天在做题时,发现定义整型数组a[10],并赋初值,然后我访问a[11],输出0,再a[11]=3后访问a[11],输出3,a的长度还是10,那么a[11]存在哪里了?其实原问题下的回答已经能解决题主的问题了,只是自己也有些小思考,想着好久未写博客了,分享一点关于越界访问的经验。首先,声明了int型数组a[10]的话,可知a指针指向RAM中一个区域,其后 10 x size转载 2016-09-12 23:23:41 · 624 阅读 · 0 评论