
C/C++
文章平均质量分 75
由于项目需要,笔者最近在写Linux C程序代码,终于意识到C语言的博大精深。指针,数组,地址。。。,项目接近尾声,笔者也费了许多精力,查了很多资料,通过博客的方式分享笔者的学习也是一件快事!
BruceZhang
计算机专业的一个小学生
展开
-
C++智能指针
1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制。Java的垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收。但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟病。更进一步地说转载 2013-07-13 20:23:57 · 1890 阅读 · 0 评论 -
C++中智能指针的设计和使用
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷转载 2013-07-13 18:56:32 · 1601 阅读 · 0 评论 -
C语言中判断int,long型等变量是否赋值的方法
博主这段时间在写一些C程序的代码,由于以前对C不是了解很多,故遇到很多瓶颈,当然,其中也有很多有趣的方法可以利用以解决这些难题,下面这个问题就是博主遇到的一个麻烦。 声明了 int ,long 型等局部变量,在利用一些方法给这些变量赋值之后,想判断这些变量是不是真的被赋初值了,怎么办?当然,如果你不赋值给局部变量,这样会导致整个程序的崩溃,因为,它的内容被系统指向了垃圾内存。下面我们看一段代码:#原创 2013-07-10 20:28:54 · 5089 阅读 · 2 评论 -
关于Debug和Release之本质区别的讨论
一、Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。 Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd转载 2013-07-09 20:33:21 · 3627 阅读 · 0 评论 -
C语言assert的用法
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:#include #include转载 2013-07-09 20:07:57 · 36351 阅读 · 1 评论 -
C语言中字符串常用函数--strcat,strcpy
strcpy原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。函数实现:/*************转载 2013-07-09 19:54:24 · 4977 阅读 · 0 评论 -
C语言--字符串和数字的相互转换
1.数字转换为字符串sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。sprintf 是个变参函数,定义如下: int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面可以接任意多个参数。printf 和sprintf 都转载 2013-07-09 18:54:39 · 5489 阅读 · 0 评论 -
二维指针动态分配内存连续问题分析
当我们定义一个二维指针时,如果需要存储相应的数据,就需要我们动态的分配内存,这时,有一点是需要注意的,分配内存的方法不同,内存的连续性也是不相同的,首先,博主先贴出测试代码:#include #include using namespace std;#define nWidth 3#define nHeight 4//内存是否连续分配问题 int main(int argc,原创 2013-07-08 10:26:43 · 2845 阅读 · 0 评论 -
C语言符号优先级
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .成员选择(对象)对象.成员名 ->成员选择(指针)对象指针->成员名 2-负号运算符-表达式右到左单目运算符(类型)强制类型转换(数据类型)表达式 ++自增运算符++变量名/变量名++单目运算符--自减运算符--变量名/变量名--单目运算符*取值运算符*指针变量单目运算符&转载 2013-07-08 09:21:01 · 2032 阅读 · 0 评论 -
int(*p)[]和int(**p)[]
1. int(*p)[10]:根据运算符的结合律,()的优先级最高,所以p是一个指针,指向的一个维度为10的一维数组。p一个指向数组的某一行int a[1][4]={1,2,3,4}; int (*p)[4] = a;//p point to the row of array a for(int i=0;i<4;i++) { cout<<*((*p)+i)<<"转载 2013-07-08 09:04:24 · 5547 阅读 · 1 评论 -
动态分配二维数组
方法一:内存不连续 假设数组元素的数据类型是int型,则动态分配二维数组的一般方法是这样: int **p = NULL; p = (int **)malloc(nWidth * sizeof(int *));if (!p) return NULL; for (int j = 0; j < nWidth; j++) {转载 2013-07-08 09:03:19 · 2922 阅读 · 0 评论 -
int*p[ ]与int(*p)[ ]的不同
举例说明:1)int* p[2] 是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型。可以这样来用:#include using namespace std;int main(int argc, char* argv[]) {int* p[2];int a[3] = {1, 2, 3};int b[4] = {4, 5, 6, 7};p[0] = a;转载 2013-07-08 09:00:38 · 6658 阅读 · 1 评论 -
C语言之free函数及野指针
【FROM MSDN && 百科】原型: void free(void *ptr);#include或#include Deallocate space in memory释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。注意:连续两次使用free函数,肯定会发生错误。malloc的次数要和free的次数相等。A转载 2013-07-07 18:41:30 · 3605 阅读 · 0 评论 -
C语言野指针
本文转载自:http://blog.youkuaiyun.com/xwdok/article/details/576497“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。“野指针”的成因主要有两种:(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指转载 2013-07-07 18:39:46 · 2653 阅读 · 2 评论 -
C语言中的sizeof解析
1. 定义:sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char、signedchar和unsigned char的sizeof值为1,毕竟cha转载 2013-06-26 15:39:47 · 3368 阅读 · 0 评论 -
C语言实现修改文本文件中的特定行
最近由于项目需要实现修改文件的功能,所以,博主认真查阅了一些资料,但是,很遗憾,并没有太多的收获。好的,首先我先叙述下功能要求:其实很简单,就是Shell中sed命令的C语言实现,实现定位到所需要的字段的那一行,之后修改成需要的内容。但是由于C语言是面向过程的语言,需要顺序执行的特点,所以,实现中遇到了很多麻烦,在这里博主将实现的过程描述如下,以便大家参考。问题描述:文本内容:wireless.1原创 2013-06-24 21:11:50 · 18705 阅读 · 5 评论 -
C语言函数strstr()分析及实现
原型:char *strstr(const char *str1, const char *str2);#include找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。返回该位置的指针,如找不到,返回空指针。Returns a pointer to the first occurrence of strSearch in str, or NULL if strSe转载 2013-06-23 18:49:05 · 9390 阅读 · 0 评论 -
C 语言内存区域分配(进程的各个段)详解
C语言可执行代码结构 名称内容代码段 可执行代码、字符串常量数据段 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据BSS段 未初始化全局变量,未初始化全局静态变量栈 局部变量、函数参数堆 动态内存分配 一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码转载 2013-06-20 15:14:02 · 3456 阅读 · 0 评论 -
对C语言中递归算法的分析
C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。 这里有一个简单转载 2013-06-19 10:00:22 · 2225 阅读 · 0 评论 -
C语言中 sscanf 的用法
名称:sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源转载 2013-06-19 08:53:57 · 3018 阅读 · 0 评论 -
C语言中字符数组和字符串指针分析
本文转载自:http://www.cnblogs.com/gigikouyi/archive/2006/08/01/464737.html测试程序如下:#include int main(int argc, char *argv[]){ char day[15] = "abcdefghijklmn"; char* strTmp = "opqrstuvwxyz"; printf转载 2013-06-18 19:08:28 · 1414 阅读 · 0 评论 -
C语言中sizeof与strlen区别
本文转载自:http://www.2cto.com/kf/201109/105100.html1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0".2. 字符串直接量作为字符指针的初始值 "hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重转载 2013-06-18 19:06:10 · 1531 阅读 · 0 评论 -
C语言中的位运算和逻辑运算
这篇文章来自:http://blog.youkuaiyun.com/qp120291570/article/details/8708286位运算C语言中的位运算包括与(&),或(|),亦或(^),非(~).下面的代码包扩了这些基本运算,还有一个两个数的交换(不用第三个数)。#include#include//print a int in binaryvoid bit_print(int a){ i转载 2013-06-16 21:17:10 · 1628 阅读 · 1 评论 -
C++ 程序不一定从 main 处开始执行
C++程序我们一般写程序都知道,是从main开始执行,不过,也有例外,比如以下这段程序#include #include using namespace std;class A {public: A() { cout << "I come here before main()!" << endl; f(); } static void f() {原创 2013-06-10 12:33:22 · 5046 阅读 · 0 评论 -
有限状态机
有限状态机是一种数学概念,运用到程序中,可用于有限数量的状态的变化,每个子程序进行一些处理并选择下一种状态。基本的实现思路就是用一张表保存所有可能的状态,并列出进入每个状态时可能执行的所有动作,其中最后一个动作就是计算下一个应该进入的状态。运行状态就是从初始状态开始,不停的在各个状态之间转换,直到结束状态。FSM的实现方式:1) switch/case或者if/else这无意是最直观的方式,使用一原创 2013-06-08 09:25:38 · 3497 阅读 · 0 评论 -
回调函数
什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 为什么要使用回调函数? 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。 如果想知道回调函数在实际中有什么作原创 2013-06-04 14:20:32 · 1961 阅读 · 0 评论 -
如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
这篇文章转自博客园一博主,感谢博主的分享Linux是一个以C/C++开发为主的平台,无论是Kernel或是Application,主要都使用C/C++开发。传统在Linux下开发程序,是在文字模式下,利用vi等文字编辑器撰写C/C++程序存盘后,在Command line下使用gcc编译,若要debug,则使用gdb。这种开发方式生产力并不高,若只是开发学习原创 2013-04-19 16:23:14 · 4684 阅读 · 2 评论 -
c语言实现双链表
#include #include #include typedef struct myList DNode; struct myList { DNode *next; DNode *prev; int data; }; DNode* init(int data); void insertLastNode(DN原创 2013-04-19 15:45:05 · 1625 阅读 · 0 评论 -
50个c/c++源代码网站
1、http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C++脚本和程序。所有程序都分为不同的类别。 3、http://www.planetsourcecode.com/原创 2013-04-19 15:43:15 · 2447 阅读 · 0 评论 -
C中的静态库
3. 静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库,我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后要讲到的environ变量)。本节介绍怎么创建这样一个库。我们继续用stack.c的例子。为了便于理解,我们把stack.c拆成四个程序文件(虽然实际上没太大必要),把main.c改得原创 2013-04-03 14:44:55 · 1860 阅读 · 0 评论 -
变量和函数的定义和声明
2. 定义和声明 2.1. extern和static关键字 在上一节我们把两个程序文件放在一起编译链接,main.c用到的函数push、pop和is_empty由stack.c提供,其实有一点小问题,我们用-Wall选项编译main.c可以看到:$ gcc -c main.c -Wallmain.c: In function ‘main’:main.c:8: wa原创 2013-04-03 14:22:03 · 3124 阅读 · 0 评论 -
C语言中的预处理详解
目录 一.预处理的工作方式... 31.1.预处理的功能... 31.2预处理的工作方式... 3二.预处理指令... 42.1.预处理指令... 42.2.指令规则... 4三.宏定义命令----#define. 43.1.无参数的宏... 43.2带参数的宏... 53.3.预处理操作符#和##. 63.3.1.操作符#. 63.3.2.转载 2013-04-02 23:04:43 · 37278 阅读 · 3 评论 -
堆栈
2. 堆栈 我们已经对堆栈这种数据结构有了初步认识。堆栈是一组元素的集合,类似于数组,不同之处在于,数组可以按下标随机访问,这次访问a[5]下次可以访问a[1],但是堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。如果所有元素的类型相同,堆栈的存储也可以用数组来原创 2013-04-01 18:21:22 · 1822 阅读 · 0 评论 -
C语言项目--教师信息/学生成绩管理系统
这个系统实现两个功能,分别是管理教师的信息和学生的成绩,用户可以选择切换实现相应的功能。话不多说了,现在看下程序的实现截图:这里给出程序代码下载地址:http://download.youkuaiyun.com/detail/dlutbrucezhang/5191828下面贴出部分代码:void add_tea(Teacher tea[]) {原创 2013-03-28 15:18:12 · 5561 阅读 · 1 评论 -
malloc,calloc,realloc,free函数
在进行C/C++编程的时候,需要程序员对内存的了解比较清楚,经常需要操作的内存可分为下面几个类别: 1.堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的; 2.堆区(heap):一般由程序员分配与释放,如果编程者不释放,程序结束时可能由操作系统回收(注意:C/C++没有这种回收机制,但Java/C#有)原创 2013-03-27 08:15:28 · 3879 阅读 · 1 评论 -
C语言中的extern关键字用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。1. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a原创 2013-03-26 21:56:15 · 1844 阅读 · 0 评论 -
C语言中的#ifndef、#def、#endif等宏
#ifndef x #define x ... #endif 这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。 #ifndef x原创 2013-03-26 19:30:54 · 3340 阅读 · 0 评论 -
C语言产生随机数
在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int原创 2013-02-12 22:58:43 · 8046 阅读 · 0 评论