随笔分类 - C/C++
摘要:想成为嵌入式程序员应知道的0x10个基本问题:预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
阅读全文
摘要:这部分是ANSI C的一些问题,题目的前提是必须都答对,看似很变态,但是细想一下,这些都是最基础的,虽然我们在使用他们的时候会犯这样那样的错误,但是最终目的是不犯错误,不是么,那么好,从最基础的开始。1、 如何在C中初始化一个字符数组。这个问题看似很简单,但是我们要将最简单的问题用最严谨的态度来对待。关键的地方:初始化、字符型、数组。最简单的方法是char array[];。这个问题看似解决了,但是在初始化上好像还欠缺点什么,个人认为:char array[5]={'1','2','3','4','5'};或者ch
阅读全文
摘要:#include<stdio.h>#include<string.h>#include<malloc.h>#define max(a,b) (a)>(b)?(a):(b)int big_add(char*,char*,char*);int big_sub(char*,char*,char*);int big_compare(char*,char*,int*);int is_number_string(char*); int main(){ char num1[80],num2[80],num3[100]; puts("First number
阅读全文
摘要:/*初始化单链表,并在只遍历一次的情况下倒序*/#include<stdio.h>#include<stdlib.h>typedef struct Node{int data;struct Node *next;}node;struct Node * nodeinit(void) //构建单链表{node *head,*p,*q;head=(node*)malloc(sizeof node);int x=0,n=0;while(1){printf("input the number:\n");scanf("%d",&x);
阅读全文
摘要:#include<stdio.h>union node //联合体union的存放顺序是所有成员都从低地址开始存放。{ int i; char a;};int main(){ node num={0}; num.i=1; int k=0; k=(num.a)?1:0; //若为小端模式,则a应该是1,表达式返回1; printf("%d\n",k); return 0;}
阅读全文
摘要:任何代码的美丽不仅在于找到一个给定的问题的解决方案,但在它的简单性,有效性,紧凑性和效率(内存)。设计的代码比实际执行更难 。因此,每一个程序员当用C语言开发时,都应该保持这些基本的东西在头脑中。本文向你介绍规范你的C代码的10种方法。1. 避免不必要的函数调用考虑下面的2个函数:void str_print( char *str ){ int i; for ( i = 0; i < strlen ( str ); i++ ) { printf("%c",str[ i ] ); }}void str_print1 ( char *str ) { int len; le
阅读全文
摘要:信息来源:邪恶八进制信息安全团队(www.eviloctal.com)原始出处:51jsp.cn 今天在网上看到了这样一个问题,“如果malloc 了一块字符串的内存,然后,它改变了这个字符串的大小,问会不会有一部分内存没有被释放掉。”这个问题,以前的确没有仔细想过。 当然,我觉得是肯定会释放掉的,但是一直没有了解过free 的原理,不敢乱说。我看了一下操作系统的内存管理,基本上是这样的,当然各个系统的实现不一样。 操作系统管理内存,维护了一个空闲内存链表,malloc从个链表中选出一个来使用,每个内存块都有一个头部来表示这个内存的基本信息,如内存大小, 所以free 时候 能够记住...
阅读全文
摘要:http://blog.csdn.net/jingxuewang110/article/details/67895571.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应,free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限
阅读全文
摘要:http://blog.csdn.net/hi_dzj/article/details/5993146 一、冒泡排序 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]...
阅读全文
摘要:一 面向对象(oop)1.封装2.继承基类---->派生类3.多态:派生类中可能出现与基类同名的方法。针对基类与派生类同名的方法,派生类要有自己的行为,必须要覆盖基类的方法。二 虚函数virtual funname(。。) // 基类允许实现该方法纯虚函数:virtual funname()=0 //基类不存在对该方法的实现。一个类中包含了一个纯虚函数,那么该类叫抽象类。 抽象类不能实例该类的对象。如果派生类也没有去实现基类中的纯虚函数,那么该派生类也是一个抽象类。三 多态(override)要和函数的重载(overload)区分1.多态是在存在继承关系的类中,看是否有相同的方法。2.重
阅读全文
摘要:对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且char*="aaa"的写法现在不被提倡,应予以避免。strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。int *p=NULL, sizeof(*p) = sizeof(int) = 4,是说整型数占用几个字节。某32位系统下, C++程序,请计算sizeof 的值#include <stdio.h>#include <mallo
阅读全文
摘要:#include<stdio.h>int main(void){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1); //&a代表整个数组的地址,+1应该加上sizeof(a)的长度,所以ptr指向a[5]位置处。printf("%d %d\n",*(a+1),*(ptr-1));//a代表数组首元素的地址,+1应该加上sizeof(a[0]),所以a+1指向a[1]处。return 0; //输出是 2 5 } 对指针进行加1 操作,得到的是下一个元素的地址,而不是原有地址值直接加1。所以,一个类型为T的指针
阅读全文
摘要:int quickOnce(int * data, int left, int right){int tmp;tmp = data[left];while(left<right){//右边找个小于tmp的数放到左边while(left<right){if(data[right] < tmp){data[left] = data[right];break;}right--;}//左边找个大于tmp的数放到右边while(left<right){if(data[left] > tmp){data[right] = data[left];break;}left++;}}
阅读全文
摘要:静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。静态局部变量定义: 在局部变量的说明前再加上static说明符就构成静态局部变量。 例如: static int a,b; static float array[5]...
阅读全文
摘要:1。函数的形参列于函数声明中,在函数定义的函数体内使用。当函数调用时,形参(任何种类的)是一类将被填充的空白或是占位符。 2。实参是用来填充形参的。当函数被调用时,实参列在函数名后面的括号里。执行函数调用时,实参被传递给形参。 3。传值调用和引用调用指的是用于参数传递过程中的一种机制。传值调用中,只使用了实参的值。传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。在引用调用机制里,以实参变量取代形参,因此任何发生在形参上的改变实际上都发生在实参变量上
阅读全文
摘要:C和C++是两件截然不同的东西,学习C++可以完全没有C的基础,或者说可以完全不用先学C;但是,这样你是永远也不可能成为真正的C++大师的;你最多只能成为一个C++的熟练工人;C和C++有一个共同的奥义:内存管理,而你不学习C,单从对C++的理解是不可能掌握这项最伟大的技术的; C++是面向对象的,C不是,它的特点是结构化程序设计思想,或者说是面向过程的;而C++在语法上以C的语法为基础,兼容C的语法,这让它看上去有点凌乱;甚至C的程序不需要任何改动就可以用C++的编译器编译;对于已经掌握C语法的人,学习C++比学习其它语言(如Delphi)要觉得容易些;而对于资深的C程序大师,那么学习C++
阅读全文
摘要:#include<stdio.h>voidmain(){inti;for(i=0,printf("first=%d\n",i);i<10,printf("second=%d\n",i);i++,printf("third=%d\n",i)){printf("forth=%d\n",i);}}这段代码会无限循环下去,因为中间的条件是个逗号表达式,逗号表达式的值是最后一个表达式的值。c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程
阅读全文
摘要:01#include<stdio.h> 02int main() 03{ 04int a[5][5]={1,3,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}; 05int (*p)[5]; //p是一个数组指针,它指向一个数组,这个数组里面有5个元素。 06p=a; // p是指向a[0][5]这个小数组的首地址,不是指向a[0][0]这个元素的首地址,所以p+1表示a[1][5]这个小数组的首地址 07printf("%d\n",**(p+1)); // 6 08printf(&q
阅读全文
摘要:int a[10];a[10]={1,2,4,5,1,5,1,2,3,4} //出错,因为此时a[10]代表一个元素,而且是已经越界的元素。int a[10]; 数组a里全是随机值int a[10]={}; 数组a里全是0int a[10]={1,5,2,1,13}; 后面5个全是0只要定义数组时有=,就会初始化。
阅读全文
摘要:有了动态内存分配的基础,要实现链表就不难了。 所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分: 1、数据域:用来存储本身数据 2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。 例:typedef struct node{ char name[20]; struct node *link;}stud; 这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用...
阅读全文
浙公网安备 33010602011771号