C语言编程
文章平均质量分 62
a1232345
这个作者很懒,什么都没留下…
展开
-
C结构体中的函数指针与函数
1. 函数指针 一般的函数指针可以这么定义:int(*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:int add2(int x,int y){return x+y;}那么在实际使用指针func时可以这样实现:func=&add2; //指针赋值,或者func=add2;add2原创 2014-07-25 19:39:13 · 930 阅读 · 0 评论 -
typedef struct 用法详解和用法小结(一)
本文c第一篇:typedef struct与struct的区别转载 2014-07-25 20:03:57 · 1274 阅读 · 0 评论 -
C语言的条件编译#if, #elif, #else, #endif、#ifdef, #ifndef
(一)条件编译方法 条件编译是通过预编译指令来实现的,主要方法有:1、#if, #elif, #else, #endif #if 条件1 代码段1 #elif 条件2 代码段2... #elif 条件n 代码段n #else 代码段 n+1 #endif 即可转载 2014-07-25 17:58:57 · 10042 阅读 · 0 评论 -
typedef struct 用法详解和用法小结(二)
struct _x1 { ...}x1; 和 typedef struct _x2{ ...} x2; 有什么不同?其实, 前者是定义了类_x1和_x1的对象实例x1, 后者是定义了类_x2和_x2的类别名x2 ,所以它们在使用过程中是有取别的.请看实例1.[知识点]结构也是一种数据类型, 可以使用结构变量, 因此, 象其它 类型的变量一样, 在使用结构变量时要先对转载 2014-07-25 20:38:27 · 666 阅读 · 0 评论 -
const char*, char const*, char*const的区别
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 这个知识易混点之前是看过了,今天做Linux上写GTK程序时又出现个Warning,发散一下又想到这个问题,于是翻起来重嚼一下。事实上这个概念谁都有只是三种声明方式非常相似:Bjarne在他的The C++ Programming Language里面给出过一个助转载 2014-07-25 21:18:32 · 1146 阅读 · 0 评论 -
回调函数解析
看到一篇文章比较清晰透彻的讲解了回调函数,受益较大。文章如下: 透析回调函数http://alexclark.itpub.net/post/670/21108“先泛后精,先浅后深”的道理可是知易行难,所以常常会给技术上的小细节纠缠着,搞得晕晕乎,其中“回调函数”就是其中之一了,虽然回调,但是老是不明转载 2014-08-10 16:18:25 · 1057 阅读 · 0 评论 -
回调函数和函数指针
什么是回调函数简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。为什么要使用回调函数 因为使用回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好转载 2014-09-09 17:01:55 · 667 阅读 · 0 评论 -
C语言回调函数学习
对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用。简而言之,回调函数是一个通过函数指针调用的函数。如果你把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数。为什么要使用回调函数呢?我们先看一个小例子: Node * Search_List (Node * node, const i转载 2014-09-09 23:08:06 · 631 阅读 · 0 评论 -
全局变量 extern
全局变量(外部变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。编译时将全局变量分配在静态存储区。 有时需要用extern来声明全局变量,以扩展全局变量的作用域。 1. 在一个文件内声明全局变量 如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之转载 2014-09-11 21:49:23 · 1107 阅读 · 0 评论 -
extern关键字详解
extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。关键字编辑在一个源文件里定义了一个数组:char a[6];在另外一个文件里用下列语句进行了声明:extern char *a;请问,这样可以吗?答案与分析:1)、不可以,程序运行转载 2014-09-11 22:03:34 · 887 阅读 · 0 评论 -
浅谈C/C++中的static和extern关键字
static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性。extern, "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。一.C语言中的static关键字在C语言中,static可以用来修饰局部变量,全局变量以及函数。在不同的情况下static的作用不尽相同。(1)修饰局部转载 2014-09-12 15:46:24 · 475 阅读 · 0 评论 -
C语言中的static变量和static函数
1、静态全局变量(又称全局静态变量): (1) 静态全局变量的定义:在全局变量前加一个static,使该变量只在这个源文件中可用。 (2)全局变量与全局静态变量的区别: (a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。 (b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成原创 2014-09-17 10:27:48 · 1088 阅读 · 0 评论 -
什么时候使用const
const传奇原作:Rahul Singh 翻译:zhigang[译者注]有些地方按原文解释不通,译者根据自己的理解作了适当修改。如有不妥之处,请告知coolgrass@sina.com或参考原文。原文来自www.codeproject.com 简介当我自己写程序需要用到const的时候,或者是读别人的代码碰到const的时候,我常常会停下来想一会儿。许多程序员从来不用转载 2014-11-07 14:16:40 · 2593 阅读 · 0 评论 -
数组名和数组首地址
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中)。所谓数组的指针是指数组的起始地址,数组元素的指针数组元素的地址。 这种指针变量的定义与以前介绍的指向变量的指针变量相同。应当注意,如果数组为int型,则指针变量亦应指向int型。原创 2014-10-22 16:44:09 · 5165 阅读 · 0 评论 -
常见的C语言笔试题
#includeusing namespace std;int main(){ int array[3]={1,2,3}; cout cout return 0;}输出的结果相差2。这是为什么?转载 2014-10-22 17:42:20 · 1017 阅读 · 0 评论 -
指针做形参做局部变量以及内存分配
一级指针做形参:首先一定要明白形参和你传递参数的那个实参是两个不同的变量,即使同名也还依然不同。指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式。即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值。二级指针做形参:二级指针也是传值,但是他指向的地址是个一维指针,所以可以改变二维指针指向的地址空间里的内容也就是要申请空间的一维指针,不能改变二维指针本身的值,转载 2014-11-10 15:33:28 · 874 阅读 · 0 评论 -
内存分配时间
1、变量在声明时即分配内存,此时将根据变量的内存分配内存大小,如int类型4字节,float类型4字节,double类型8字节。如下例中的a.2、但对于数组,有以下几种情况(以int类型为例):(1)声明数组时即指定数组大小N,则此时可按N*sizeof(int)的大小分配内存。如下例中的c。(2)声明数组时虽然未指明大小,但声明的同时也对数组进行了初始化,则按初始化时的元转载 2014-11-11 11:19:08 · 1284 阅读 · 0 评论 -
动态内存分配
前言1.数组的元素存储于内存中连续的位置上。当一个数组被声明时,它所需要的内存在编译时就被分配。2.但是我们也可以使用动态内存分配在运行时为它分配内存。3.为什么使用动态内存分配1>当使用数组时,必须用一个常量来指定数组的长度。但是,有时候,数组的长度常常在运行时才知道。因此,在某些情况下,我们通常采取声明一个较大的数组,它可以容纳可能出现的最多元素。2>该转载 2014-11-11 11:21:05 · 761 阅读 · 0 评论 -
指针与数组的对比
7.3指针与数组的对比 C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比转载 2014-11-10 15:46:19 · 510 阅读 · 0 评论 -
编译时候如何配置连接库的搜索路径
交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,/lib两个目录。因此,在交叉编译的时候,要采取一些方法使得在编译链接的时候找到需要的库。 首先,要知道:编译的时候只需要头文档,真正实际的库文档在链接的时候用到。 (这是我的理解,假如有不对的地方,敬请网上各位大侠指教) 然后,讲讲如何在交叉编译链接的时候转载 2014-10-08 22:57:54 · 2754 阅读 · 0 评论 -
数组名作为函数的参数(1)
9.5.4 数组名作为函数的参数(1)在前面章节介绍函数时,曾介绍过用数组名作函数的实参和形参的情况。在学习指针变量之后,可以从指针角度对这种参数的传递进行理解。数组名就是数组的首地址,当实参向形参传送数组名时,实际上就是传送数组的地址,形参得到该地址后就与主调函数中的实参指向同一数组。这样,在被调函数中对数组元素的值进行修改返回主调函数后,通过实参同样可以访问到。这就解决了C函转载 2014-11-11 17:32:23 · 1952 阅读 · 0 评论 -
指针参数是如何传递内存的?
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num);}转载 2014-10-14 20:24:11 · 766 阅读 · 0 评论 -
空指针、零指针、野指针
1. 空指针、NULL指针、零指针1.1什么是空指针常量0、0L、'\0'、3 - 3、0 * 17 (它们都是“integer constant expression”)以及 (void*)0 (我觉得(void*)0应该算是一个空指针吧,更恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一转载 2014-11-12 16:34:38 · 900 阅读 · 0 评论 -
memset函数详细说明
1。void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。2。例子#includevoid main(){char *s="Golden Global View";clrscr();memset(s,'G',6);printf("%s",s);getchar()转载 2014-10-10 14:52:51 · 790 阅读 · 0 评论 -
数组,结构体初始化 {0}
一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1};是把a所有的元素初始化为1.调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。PDF的竟然不然复制,就把它这章翻译了,如下5.2.1 数组初始化数组可以用一个列值来初始化,例如 int v1[]转载 2014-10-29 10:38:14 · 1839 阅读 · 0 评论 -
C语言字符串,字符转数字,数字转字符
在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串。字符串是以“\0”作为结束符。C/C++提供了丰富的字符串处理函数,下面列出了几个最常用的函数。 ● 字符串输出函数puts。 ● 字符串输出函数gets。 ● 字符串连接函数strcat。 ● 字符串复制函数strcpy。 ● 测字符串长度函数strlen。字符串是面试的转载 2014-10-28 16:45:22 · 988 阅读 · 0 评论 -
调试常用的 __FILE__, __FUNCTION__, __LINE__
仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧。 对象反射库、调试工具及代码分析器,经常会需要在运行时访问函数的名称,直到不久前,唯一能完成此项任务并且可移植的方法,是手工在函数体内嵌入一个带有该函数名的硬编码字符串,不必说,这种方法非常单调无奇,并且容易导致错误。本文将要演示怎样使用新的C9转载 2014-10-12 19:26:11 · 519 阅读 · 0 评论 -
C语言 ## __VA_ARGS__ 宏
在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: 12#define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg)用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参转载 2014-10-12 20:10:32 · 696 阅读 · 0 评论 -
什么时候需要动态分配内存?
我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??既然有人会问这样的问题,那么我在这里好好的讲解一下吧!首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=原创 2014-10-31 10:31:08 · 3665 阅读 · 1 评论 -
数组给数组赋值问题
char a[3],b[]="China";a=b;printf("%s",a);这个程序段运行后的结果是China,还是本来就是错误的??C语言中数组能这样直接相等吗??楼主可能把指针和数组名的作用给混淆了! 我看了楼上的解释,很详细,但恐怕楼主既然提出了这样的问题,估计也看不懂上面的解释,或者费解!我给你稍微解释下:首先数组名a和b的值是地址,各表示a[3],b[]这两个数组的首地址,而且数转载 2014-10-31 10:26:17 · 3457 阅读 · 0 评论 -
菜鸟在C语言编译,链接时可能遇到的两个问题
菜鸟在C语言编译,链接时可能遇到的两个问题最近在看 CSAPP (Computer Systems A Programmers Perspective 2nd) 的第七章 链接。学到了点东西,跟大家分享。下文中的例子都是出自CSAPP第七章。另外,也可以结合酷壳上的这篇文章和之后的留言来看本文,理解会更加深刻一些。1.问:如果在不同的C源文件中定义了相同名称的全局变量会有什么样转载 2014-10-31 22:11:41 · 758 阅读 · 0 评论 -
warning: assignment makes pointer from integer without a cast
编译的时候报警告:warning: assignment makes pointer from integer without a castwarning: assignment makes pointer from integer without a castwarning: assignment makes pointer from integer without a原创 2014-11-01 23:17:53 · 60734 阅读 · 0 评论 -
C语言数组参数与指针参数
我们都知道参数分为形参和实参。形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值。一、一维数组参数1、能否向函数传递一个数组?看例子:void fun(char a[10]){ char c = a[3];}intmain(){ char b[10] = “abcdefg”; fun(b[10]); retu转载 2014-10-14 20:39:33 · 952 阅读 · 0 评论 -
warning: deprecated conversion from string constant to "char *"
今天碰到了这个警告,老老实实的google了一下,以下是收获:问题是这样产生的,先看这个函数原型:void someFunc(char *someStr);再看这个函数调用:someFunc("I'm a string!");把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。为什么呢?原来char *背后的含义是:给我个字符串转载 2014-11-02 00:15:40 · 635 阅读 · 0 评论 -
C语言中main函数之前可以进行赋值作吗?
这两天用结构模拟面向对象的方法在C语言中编写硬件的驱动程序,涉及到多文件的变量的初始化问题。如下: 在DS1302.h中定义了一个结构: typedef struct{ void (*fun1); void (*fun2); }DS1302_T; extern DS1302_T ds1302; 并声转载 2014-10-31 22:38:57 · 2203 阅读 · 0 评论 -
指针做形参做局部变量以及内存分配
一级指针做形参:首先一定要明白形参和你传递参数的那个实参是两个不同的变量,即使同名也还依然不同。指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式。即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值。二级指针做形参:二级指针也是传值,但是他指向的地址是个一维指针,所以可以改变二维指针指向的地址空间里的内容也就是要申请空间的一维指针,不能改变二维指针本身的值,转载 2014-10-14 17:19:06 · 546 阅读 · 0 评论 -
C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而转载 2014-11-01 23:34:06 · 589 阅读 · 0 评论 -
指针直接赋值与strcpy区别
C/C++ code?12345char* p1="abcdefg";char* p2; p2=p1;strcpy(p2,p1);p2=p1;strcpy(p2,p1);这两个语句有什么区别??解析:转载 2014-11-03 17:03:29 · 3192 阅读 · 0 评论 -
编译时出现multiple definition of `xxxxxx'的解决办法
出错原因:一般是因为在to原创 2014-11-03 16:34:47 · 5845 阅读 · 0 评论 -
C语言malloc和free
在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用—— 就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以 写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助转载 2014-10-18 23:55:24 · 920 阅读 · 0 评论