
C language programing
薄荷微光少年梦
这个作者很懒,什么都没留下…
展开
-
学习C语言的理由-别问我为什么,会用C语言,就是NB
一、前言对于理工 科学生来说,这个答案可能很简单,因为这是一门必修课。而对于程序员来说选择一门编程语言,在某种程度上,对职业生涯的发展会产生重大的影响,所以必须慎 之又慎。那么,为什么要选择一门诞生了将近半个世纪的语言?本文不是老生常谈的废话,如:”C 语言是编程的基础”、”学好 C 语言,走遍天下都不怕”等等,本文力争详尽而又有理的回答这个问题,旨在成为最好的为什么要学习和使用转载 2015-05-26 17:26:51 · 1934 阅读 · 0 评论 -
关于sizeof 和 strlen的区别
前几天在写c程序的时候,突然遇到个问题,原来是这两个没搞清,特地去网上找了两个的区别拿来分享。1. 编译时计算运算符sizeof,可用类型或变量做参数,计算占用内存的大小。sizeof后若是类型必须加括弧,若是变量名可不加括弧。sizeof(x)可用来定义数组维数。如:printf("%d\n",sizeof(short));输出的结果为短整型的长度2。用结构类型或变量做参数时,s转载 2012-08-15 11:29:05 · 584 阅读 · 0 评论 -
C语言编程不得不养成的好习惯
1:函数参数检查我们一般写一个函数,从来不会对函数的实参进行合法性检查,其实这是很不好的习惯。因为通常我们的函数不会出问题,但是如果参数有问题,这个错误是和不好发现的。对参数的合法性检查可以提高程序的健壮性,如自动有提示,可提高可维护性。2:确保数组越界。我们应该时刻记住这点。如果往里存储一个字符串,别忘了,最后一位是"\0"3:定义变量初始化定义变量后,应该尽快对其初始化原创 2012-07-27 15:44:50 · 1951 阅读 · 0 评论 -
位域应用——大小端模式对union体的影响的反思。
union{ struct { unsigned char c1:4; unsigned char c2:4; }s; unsigned char c;}u;int main(){u.c=1;printf("%d\n",u.s.c1);return 0;}这道题,感觉非常简单。但是却弄错了,原因是,忽略了大小端模式的影响:重申:原创 2012-07-26 16:03:51 · 2213 阅读 · 0 评论 -
计算一个整数中含1的比特数
注:代码引用自李亚锋的 《C面试真题精讲》 解析部分为原创。原书中的解析有点不够清晰。描述:编写一个函数,实现功能为:输入一个无符号整数,计算出该整数中含1的比特个数。如给定一个整数8(二进制为1000),它含1的比特数为1。该题目的实现方法可以说是多种多样,如果不考虑效率的话,最简单的方法就是把该整数先转换为2进制,对其每一位进行判断是否为1,然原创 2012-07-25 20:58:05 · 3676 阅读 · 0 评论 -
一道程序题的反思——一些为了减少内存的开销
已知含有N个元素的一个数组,数组中各元素的范围是1~N-1,找出重复的那个值。(就是有N-1个数都填充到N个位置,这N-1个数至少出现一次,就是说,肯定有哪个数出现了两次,把这个数找出来。这道题,在去年冬天的澡堂里,同学和我讨论过,就是建一个一样大的数组,将原来的数组遍历一遍,相应的位置置1,当再次置1时,返现已经是1时,这就是那个数。但是我一般一定会用int a[N]原创 2012-07-25 16:54:10 · 1011 阅读 · 0 评论 -
数值溢出运算
char chr=127; int sum=100; chr+=1; sum+=chr;chr是char类型,共八位。赋值127。8位为0111 1111。此时若用%d格式打印出来时,规则是,看最左侧为0.为正,绝对值为2^7-1,即127。chr++后,二进制为1000 0000。用%d打印出来为,最左侧为1,为负值。绝对值,要考虑8位。及2^7.即为-128。ch原创 2012-07-25 22:12:56 · 2738 阅读 · 1 评论 -
#define 中 的“##”与“#”
#include #define test(n) printf("test("#n")=%d\n",val##n)#define a #aint main(){int val3=10;int val8=23;test(3);test(8); }在#define中定义了“#”,“##”两种操作。“#”用来把参数转换成字符串,“##”则用来连接前后两个参数,把他们变成一个字符串。原创 2012-07-26 15:24:08 · 960 阅读 · 0 评论 -
C语言malloc()的一个问题——堆越界的一个错误。
malloc函数分配得到的空间是存储在堆区的。系统推出后是不会被释放的,必须由程序员自己用free释放。#include #include #include #include #include int main(){ int address;char *q; char *p=(char *)malloc(sizeof(char)*10);q=strcpy(p,"che原创 2012-07-24 22:09:51 · 6644 阅读 · 0 评论 -
出现频率最高的笔试题strcpy写法及注意事项
出现频率最高的笔试题strcpy写法题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。解说: 1.strcpy的实现代码 char * strcpy(char * strDest,cons原创 2012-07-24 21:00:58 · 1671 阅读 · 4 评论 -
12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!1.gets()函数问:请找出下面代码里的问题:#include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer e转载 2012-09-09 14:20:06 · 593 阅读 · 0 评论 -
解一道面试题——华为社招现场面试1:请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。
华为社招现场面试1:请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。代码如下:#include #include void computing(int* array1,int* array2,int* array3,int array1_length,int array2_length,原创 2012-10-16 20:17:24 · 6476 阅读 · 6 评论 -
华为面试2:1分2分5分的硬币,组成1角,共有多少种组合。
1分最多10个。2分最多5个;5分最多2个:其他种情况为混合。 看程序:#include #include void main(){ int i,j,k,num; num=0; for (i=0;i<=10;i++) { for (j=0;j<=5;j++) { for (k=0;k<=2;k++) {原创 2012-10-16 21:33:18 · 2773 阅读 · 0 评论 -
深度剖析排序算法(一)——冒泡排序内涵及其改进方法。
一:冒泡算法冒泡算法的名字来历,来自于较轻的气泡会上升,较重的气泡会下降这么一个物理事实。假设有一组数。排成列。存储在数组a[10]中。我们可以利用这个物理现象来使其按照升序或者降序排列。从头至尾部时,我们希望把最重的或最轻的放置头部。这时我们知道,头部是最重的。这时,我们需要从第二个位置开始往尾部遍历。使剩下数目的最重的气泡放在第二个位置。在选取哪个最重的气泡时,我们不得原创 2012-05-20 17:49:27 · 997 阅读 · 0 评论 -
VC++6.0与VS2008运行C语言的一点差异
此贴虽短,但是这个问题困扰了一位C语言程序员一天。 看代码:#include #include main(){ int a; a*=1; printf("%d",a);}在vs2008上的运行结果: 在VC++6.0上的运行结果: 没有报错。总结如下:在vs2008下,原创 2013-01-13 20:59:25 · 2608 阅读 · 1 评论 -
什么是bit—map
直面意思:位—映射。有人翻译成位图。这个词与其真实的意思有点不吻合。两一方面。位图通常与矢量图在一起说。本质上,其就是按位映射。 用途:统计、排序、标识大范围数据。优势:使用较少的内存。存储一大片数据。我们习惯上用int数据。或int的堆来做。 这样太费内存了。bit-map是一个比较好的方法。散列也是映射。散列的散列函数是比较灵活饿。可以讲原创 2013-01-06 13:07:26 · 1296 阅读 · 0 评论 -
系统调用和库函数调用的区别
从程序完成的功能来看,函数库提供的函数通常是不需要操作系统的服务. 函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的。系统调用是要求操作系统为用户提供进程,提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等。 函数库的函数,尤其与输入输出相关的函数,大多必须通过Linux的系统调用来完成。因此我们可以将函数库的函数当成应用程序设计人员与系统原创 2012-12-04 15:12:03 · 687 阅读 · 0 评论 -
C语言写“a+aa+aaa+aaaa+aaaaa+……”
考虑三个问题:基数:a进制:可能是10进制,可能是2进制。阶数:最大的那个数是几位。 看代码:#include #include int add(int baseNum,int jinzhi,int jieNum);int main(){ printf("%d",add(1,2,2));//以十进制打印}int add(int bas原创 2012-11-27 13:46:35 · 4500 阅读 · 0 评论 -
c语言中的变量(局部变量,外部变量,静态变量,寄存器变量) .
c语言中变量分为四类,分别是1.auto 自动变量2.static 静态存贮分配变量(又分为内部静态和外部静态)3.extern 外部变量/全程变量(用于外部变量说明)4.register 寄存器变量(分配在硬件寄存器中)四大类,所有变量必须先说明(定义),后使用。下面分别介绍1.自动变量(转载 2012-10-25 21:04:39 · 2099 阅读 · 0 评论 -
C语言中,static的作用?
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)第一个作用:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容#include增加这条语句char a = ‘A‘; // global variablevoid msg转载 2012-10-25 21:03:32 · 3275 阅读 · 0 评论 -
C语言实现模拟键盘按键事件
#include #include #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)int main(void){ POINT pt;原创 2012-11-01 21:45:59 · 24369 阅读 · 0 评论 -
各种常见的排序算法及其实现 .
一、排序的概念一、排序(sort)或分类所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。 1.被排序对象--文件被排序的对象--文件由一组记录组成。记录转载 2012-10-20 09:45:10 · 2011 阅读 · 0 评论 -
C语言内存分配及函数返回值的解析。
C语言的内存分配主要如下:(1)栈区:在执行函数时,函数内局部变量(不包含static变量)、函数返回值的存储单元在栈区上创建,函数执行结束时这些存储单元自动被释放。栈区内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(2)堆区:即动态分配内存分配,程序在运行时用malloc(calloc,realloc等)申请的内存,程序员自己负责用free释放内存。(3)原创 2012-07-23 17:37:44 · 3375 阅读 · 1 评论 -
VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题
VC9编译的程序在没有装过VC9(确切的说是.Net Framework3.5)的机器上运行时,如果提示“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”这个错误,那么就说明该程序动态链接了VC9的运行时库,(如果还用到了MFC,那么可能动态链接了VC9的MFC库,同理还有ATL库),以及缺少对应的manifest文件,程序在目标机器上没有找到这些库和配置文件,因此转载 2012-06-28 15:47:09 · 963 阅读 · 0 评论 -
windows程序设计——CreateProcess()
关于操作系统进程和线程的编程实例】在windows NT 环境 下创建进程的和子进程的方法可以调用windows 的 API 函数 CreateProcess . 实际上即是 在一个 CreateProcessTest.exe 的程序中使用了 CreateProcess() 函数调用了另外一个可执行模块,而这个可执行模块即是CreateProcessTest.exe 的子进程 。 用很简单明了转载 2012-06-18 15:34:06 · 1228 阅读 · 0 评论 -
int main(int argc,char * argv[]) windows 下的使用
通常对于初学C语言的同学来说,我们的main函数,都是没有形参的,那么这是怎么回事呢?根据C语言规定,main函数的参数只能有两个,习惯上这两个参数为argc和argv,格式如下: int main(int argc,char * argv[]){//program//}解析:此时,main函数有两个形参。第一个argc为int整形。第二个为指针数组。也就是这个原创 2012-04-22 18:11:44 · 5781 阅读 · 2 评论 -
union体与大小端模式的探讨
int checksystem(){ union check{ int i;char ch;}c;c.i=1;return(c.ch==1)}这段代码摘自《C语言深度剖析》。其利用了共用体在大小端模式存储模式下的内存差异来验证,所运行平台是哪种模式? 原文解释如下: 再出一道题: union ASCII{原创 2012-05-02 09:20:56 · 1373 阅读 · 0 评论 -
如何高效使用C语言
引言:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。第1招:以空间换时间计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招——以空间换时间。例如:字符串的赋值。方法A,通常的办法:#define LEN 32转载 2012-04-17 17:12:36 · 1035 阅读 · 0 评论 -
再再论指针
再再论指针篇首语 指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的现象,这种不足必转载 2012-04-17 17:10:48 · 1119 阅读 · 0 评论 -
学过C语言了?那么你知道位段为何物啊?
C语言中用结构实现位段--个人心血!值得一看哦!C语言中的结构是有实现位段的能力的,噢!你问它到底是什么形式是吧?这个问题呆会给你答案。让我们先看看位段的作用:位段是在字段的声明后面加一个冒号以及一个表示字段位长的整数来实现的。这种用法又被就叫作“深入逻辑元件的编程”,如果你对系统编程感兴趣,那么这篇文章你就不应该错过! 我把使用位段的几个理由告诉大家:1、它能把长度为奇数的数据包装在一起,原创 2012-04-26 22:18:02 · 972 阅读 · 0 评论 -
最透彻的讲解结构体成员内存对齐问题——透彻理解哦
结构体成员的内存分布与对齐我们先看一道IBM和微软的笔试题:IBM笔试题:struct{ short a1;short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof( A)=6, sizeof(B)=8,为什么? 注:原创 2012-04-26 22:16:19 · 5137 阅读 · 1 评论 -
正确认识C语言在当代的地位和作用
无意中在网上看到了06年的一些关于C语言还是否值得大部分的程序员去学习的争论。中间涉及到了大量的C语言与C++、C#的一些对比,现整理出来, 方便大家查看。也是自己做个笔记。为什么每个程序员都应该学习C语言?每个程序员在他们的编程生涯中都应该学习C语言,因为它有太多难以忽视的好处了。除了它会给你提供更多的工作机会之外,C语言还会教给你更多的关于计算机的知识。它能给我们提供的裨益原创 2012-04-25 15:03:00 · 15432 阅读 · 1 评论 -
提升C语言内功的书——部分相关电子书在本人资源里
c语言学习经验.txt第一次笑是因为遇见你,第一次哭是因为你不在,第一次笑着流泪是因为不能拥有你。1.一楼建议的老谭的书,比较适合入门,但是建议不要按照上面的代码样子来写代码。这里有几本书推荐给你。C程序设计(英文版),C语言之父的杰作,建议看英文版,原汁原味,里面的代码个个都是经典,你可以看着上面的代码,多看多想多写。里面涉及到的英文不难,有一定的英文基础就可以看懂。看完上面两本,你转载 2012-04-25 16:59:39 · 2552 阅读 · 0 评论 -
详解C中volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:short flag;vo转载 2012-03-07 14:32:48 · 505 阅读 · 0 评论 -
C语言函数clock()
C语言函数clock() 功 能: 返回处理器调用某个进程或函数所花费的时间。 用 法: clock_t clock(void); 说明:clock_t其实就是long,即长整形。该函数返回值是硬件滴答数,要换算成秒或者毫秒,需要除以CLK_TCK或者 CLK_TCK CLOCKS_PER_SEC。比如,在VC++6.0下,这两个量的值都是1000,这表示硬件滴答1000下是转载 2012-04-19 17:29:15 · 9046 阅读 · 0 评论 -
如何精确计算程序运行时间——精确获取时间(QueryPerformanceCounter)
LARGE_INTEGER tima,timb; QueryPerformanceCounter(&tima);在 Windows Server 2003 和 WindowsXP 中使用 QueryPerformanceCounter 函数的程序可能执行不当QueryPerformanceCounter 來精確計算執行時間QueryPerformanceCounter 來精確計算執转载 2012-04-20 11:12:18 · 2074 阅读 · 0 评论 -
c语言 计算函数执行时间
linux c语言 计算函数执行时间 虽然在linux下我们可以用time命令来计算一个执行程序的时间,可是time命令会把输入输出时间一并计算在内,对于计算函数执行时间并不精确,所以写出以下代码计算函数的执行时间:#include#include#includeint main(){ struct timeval tpstart,tpend;转载 2012-04-20 09:31:26 · 5732 阅读 · 0 评论 -
字符与字符串
已知char c=’a‘;char *cp=“a”;请问c和 cp的区别?解析:其中c与cp都是变量而’a‘,“a”都是常量。考察两方面:字符变量与字符指针变量的区别。字符常量与字符串常量的区别。区别如下:(1)c是字符常量,用于代替单个字符。cp是字符指针变量,用于传递字符串。(2)c变量代替的是一个字符常量’a‘;而cp指针变量指向的是字符串常量"a";(3)'原创 2012-07-05 17:32:53 · 1120 阅读 · 0 评论 -
如何打印内存地址
请问在printf打印函数中一般用什么形式打印变量内存地址:答,最常用的打印地址方式是%p和0x%x。int main(){ int a;// a=4; printf("%p,%X",&a,&a); getch();}答案书上写的是%p打印出的地址自动在地址前加0x前缀,表示以16进制打印,而%x和%X没有这个前缀。地址中的字符大小写随x的大小写但是结果悲剧了:原创 2012-07-05 17:04:15 · 5183 阅读 · 0 评论 -
深入剖析排序算法(二)------直接插入排序的研究及改进
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。直接插入排序(straight insertion sort)的作法是: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中;原创 2012-05-21 16:14:55 · 851 阅读 · 0 评论