C/C++
文章平均质量分 78
如小丧
这个作者很懒,什么都没留下…
展开
-
C语言中静态和全局的区别
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以转载 2014-10-05 21:31:14 · 1029 阅读 · 0 评论 -
字符数组与字符指针
转自:http://blog.csdn.net/qiumm/article/details/56571201.字符指针可以指向一个字符串。我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:char *str = "This is a string.";是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。这里要注意字符指针与字符数转载 2014-10-05 22:16:07 · 907 阅读 · 0 评论 -
typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void);
typedef int(init_fnc_t) (void);这个就是一个取别名的过程。我们通常情况下会如下使用 typedef :typedef int MyInt;MyInt a;这个时候我们的MyInt 就和int是一样的意思。而对于函数的申明我们通常会这样申明:int InitFunction() (void);此时表示申明了一个函数名为Init转载 2014-10-08 12:14:02 · 291 阅读 · 0 评论 -
static,inline,volatile的作用
1、static (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容[cpp] view plaincopychar转载 2014-10-08 14:33:50 · 369 阅读 · 0 评论 -
char *c和char c[]区别
问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。程序演示:测试环境Devc++代码运行结果2293628 4199056 abc2293624 2293624 abc2293620 4199056 abc#include using nam转载 2014-10-05 21:33:31 · 427 阅读 · 0 评论 -
typedef和#define的用法与区别
typedef和#define的用法与区别一、typedef的用法在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:typedef int INT;typedef int ARRAY[10];typedef (int*) pINT;type转载 2014-10-08 16:11:51 · 415 阅读 · 0 评论 -
c语言中的的内联(inline)函数
c语言中的的内联(inline)函数发表于 2011 年 01 月 26 日 由 adminc/c++中的inline,使用在函数声明处,表示程序员请求编译器在此函数的被调用处将此函数实现插入,而不是像普通函数那样生成调用代码(申请是否有效取决于编译器)。一般地说,这样作的优点是省掉了调用函数的开销;缺点则是可能会增加代所生成目标代码的尺寸(二班的除外,二班情况下,inli转载 2014-10-08 14:32:03 · 486 阅读 · 0 评论 -
C语言数据类型转换详解
3. 类型转换如果有人问C语法规则中最复杂的是哪一部分,我一定会说是类型转换。从上面两节可以看出,有符号、无符号整数和浮点数加起来有那么多种类型,每两种类型之间都要定义一个转换规则,转换规则的数量自然很庞大,更何况由于各种体系结构对于整数和浮点数的实现很不相同,很多类型转换的情况都是C标准未做明确规定的阴暗角落。虽然我们写代码时不会故意去触碰这些阴暗角落,但有时候会不小心犯错,所以了解转载 2014-10-26 23:21:14 · 1268 阅读 · 0 评论 -
c语言中逗号运算符和逗号表达式
c语言中逗号运算符和逗号表达式 C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如: 3+5,6+8称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为 表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+转载 2014-10-27 17:23:59 · 497 阅读 · 0 评论 -
C语言中Const指针变量(常指针)
C语言中,指针是最难理解的一部分,尤其是Const指针变量。Const指针变量只保护其Value值不被改变,并不能保护指针所指向的地址中的值不被改变,下面是针对Const指针的一个小练习:#include "stdafx.h"int main(int argc, char* argv[]){//定义基本类型的const变量,const 位置在哪儿都可以con转载 2014-10-27 16:11:56 · 734 阅读 · 1 评论 -
C语言运算符优先级列表详解
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .转载 2014-10-12 17:13:32 · 486 阅读 · 0 评论 -
sizeof进行结构体大小的判断
typedef struct{ int a; char b;}A_t;typedef struct{ int a; char b; char c;}B_t;typedef struct{ char a; int b; char c;}C_t;void main(){ c转载 2014-11-13 20:52:18 · 369 阅读 · 0 评论 -
c语言中出现左操作数必须是左值(摘抄)
在做c语言联系的时候,总是会出现左操作数必须是左值,左值就是在赋值中可以放在赋值操作符两边的值,比如: int a = 1; double b = 2.0 a = b; b = a; 这里a和b都是左值,一切变量都是左值,但const量是例外。*p是一个左值,和变量一样,只要在*p的右边加上赋值运算符,就可改变*p的值。 如果p是一个指向常量的指针,*p就是一个不能修改的左值,即它不能被放转载 2014-10-27 16:49:40 · 5573 阅读 · 0 评论 -
C99可变长数组VLA详解
C90及C++的数组对象定义是静态联编的,在编译期就必须给定对象的完整信息。但在程序设计过程中,我们常常遇到需要根据上下文环境来定义数组的情况,在运行期才能确知数组的长度。对于这种情况,C90及C++没有什么很好的办法去解决(STL的方法除外),只能在堆中创建一个内存映像与需求数组一样的替代品,这种替代品不具有数组类型,这是一个遗憾。C99的可变长数组为这个问题提供了一个部分解决方案。 可转载 2014-10-12 11:27:03 · 5285 阅读 · 0 评论 -
C语言运算符优先级和口诀
一共有十五个优先级:1 () [] . ->2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof 3 * / %4 + - 5 >> 6 > >= 7 == != 8 & 9 ^ 10 |转载 2014-10-12 17:15:01 · 472 阅读 · 0 评论 -
函数指针与指针函数
一、辨别指针函数与函数指针最简单的方式就是看函数名前面的指针*号有没有被括号包含,如果被包含就是函数指针 ,反之则是指针函数。1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值转载 2014-10-28 17:28:17 · 321 阅读 · 0 评论 -
C语言的inline关键字
一直以来我就认为inline关键字是C++中的。今天我看到一篇讲关于C语言的inline关键字的。呵呵。。。原来是我弄错了。看来以后定义一些宏命令完全可以用这样的一些inline函数来代替了。以下是我从网上搜集来的知识点(来源:http://superding.spaces.live.com/Blog/cns!89E842A8485366C7!1137.entry)转载 2014-10-15 16:17:16 · 484 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两转载 2014-10-05 20:54:08 · 303 阅读 · 0 评论 -
C 编译、链接、加载
一、概述C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可加载、可执行代码的过程。过程图解如下: 预处理器:将.c 文件转化成 .i文件,使用的gcc命令是:g转载 2014-10-19 13:01:40 · 505 阅读 · 0 评论 -
你的变量究竟存储在什么地方?
你的变量究竟存储在什么地方?作者:杨小华 我相信大家都有过这样的经历,在面试过程中,考官通常会给你一道题目,然后问你某个变量存储在什么地方,在内存中是如何存储的等等一系列问题。不仅仅是在面试中,学校里面的考试也会碰到同样的问题。 如果你还不知道答案,请接着往下看。接下来,我们将在Linux操作系统上,以GCC编译器为例来讲解变量的存储。转载 2014-10-19 15:39:44 · 444 阅读 · 0 评论 -
select函数详细用法解析
1.表头文件#include#include#include2.函数原型int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);3.函数说明select()用来等待文件描述词状态的改变。参数n代表最大的文件描述词加1,参数readfd转载 2014-11-03 16:34:51 · 2160 阅读 · 0 评论 -
typedef struct 用法详解和用法小结
1. 基本解释typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。2. typede转载 2014-11-27 20:54:32 · 435 阅读 · 0 评论 -
char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][],
本文测试环境 : X86-64 bit 架构的服务器CentOS x64 5.xgcc version 4.1.2 20080704指针和数组是C的比较难搞懂的知识点, 需要结合内存来学习, 非常感谢各位兄弟为我指点迷津.下面总结一下 : 首先说明一下C程序在运行时, 不同的内容或变量分别存储在什么地方?分了几块区域分别是, code转载 2014-11-29 11:14:49 · 384 阅读 · 0 评论 -
C语言中strcpy,strcmp,strlen,strcat函数原型
今天去文思创新面试,考官问了我一个简单的实现,即:自己编写strcpm的实现,IBM曾经也考过写strcpy原型,这几个函数在面试的时候经常被考到,很具有代表性,突然被问起还真有点措手不及呢。现在记下供大家学习和以后温习:(下面的程序经本人通过)1、Strcat函数原型如下:char *strcat(char *strDest, const char *strScr) //将源字符串加转载 2014-11-30 19:30:49 · 450 阅读 · 0 评论 -
邻接表无向图之 C语言详解
上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7条边。上图右边的矩阵是G1在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了"该顶点的邻接点的序号"。例如,第2个顶点(顶点C)包含的链表所包含的节点的数据分别是"0,1,3";而这"0,1,3"分别对应"A,B,D"的转载 2014-12-01 11:42:40 · 2628 阅读 · 1 评论 -
前缀、中缀、后缀表达式
关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。举例:(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表转载 2014-12-17 21:58:02 · 343 阅读 · 0 评论 -
valist、vastart、vaarg、vaend可变形参数解析
int printf( const char* format, ...); 这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用”…”表示). 而我们又可以用各种方式来调用printf,如:printf("%d",value); printf("%s",str); printf("the number is %d ,string转载 2015-01-16 16:33:00 · 2768 阅读 · 0 评论 -
va_list、va_start、va_arg、va_end的原理与使用
概述由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.下面就c语言中处理不定参数数目的问题进行讨论.定义大家先看几宏.在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:#define _INTSIZEOF(n) ((sizeof(n)转载 2015-02-05 09:07:34 · 367 阅读 · 0 评论 -
C语言struct中冒号用法
typedef struct{unsigned char unused_bits:4;unsigned char wchair_state:2;} xyz; typedef struct{unsigned char unused_bits;unsigned char wchair_state;} abc;转载 2015-01-19 13:47:37 · 1802 阅读 · 0 评论 -
__attribute__ 你知多少?
GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。__attribute__ 书写特征是:__attribute__ 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attri转载 2015-02-05 15:58:15 · 347 阅读 · 0 评论 -
结构体定义:struct与typedef struct 用法详解和用法小结
一、typedef的用法在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的转载 2015-02-06 11:21:46 · 479 阅读 · 0 评论 -
C99 结构体指定初始化
在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化项目: static struct usb_driver usb_sto转载 2015-01-20 17:17:31 · 578 阅读 · 0 评论 -
C语言中的内联函数(inline)与宏定义(#define)详细解析
先简明扼要,说下关键:1、内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快。2、内联函数可以调试,而宏定义是不可以调试的。内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline。下面详细介绍一下探讨一下内联函数与宏定义。一、内联函数是什么?内转载 2015-01-21 16:21:48 · 668 阅读 · 0 评论 -
用户态和内核态堆栈
1、高位地址:栈(存放着局部变量和函数参数等数据),向下生长 (可读可写可执行)2、 堆(给动态分配内存是使用),向上生长 (可读可写可执行)3、 数据段(保存全局数据和静态数据) (可读可写不可执行)4、低位地址:代码段(保存代码)转载 2015-02-10 15:57:45 · 799 阅读 · 0 评论 -
C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域。数据段属于静态内存分配。 代码段: 代码段(code segment/tex转载 2015-02-10 15:46:50 · 466 阅读 · 1 评论 -
C语言中的左移与右移
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用int i = 1;i = i 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下转载 2015-03-02 13:36:17 · 33369 阅读 · 0 评论 -
open/read/write和fopen/fread/fwrite的区别
open/read/write和fopen/fread/fwrite的区别 open:系统调用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。fopen:C语言库函数,返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数,在不同的操作系统中应该调用不同的内核API,UNIX环境下,fopen是对open的封装。文件描述符是UNIX/Linux转载 2015-04-01 20:34:00 · 689 阅读 · 0 评论 -
C语言:正负数之间取模运算
如果 % 两边的操作数都为正数,则结果为正数或零;如果 % 两边的操作数都是负数,则结果为负数或零。C99 以前,并没有规定如果操作数中有一方为负数,模除的结果会是什么。C99 规定,如果 % 左边的操作数是正数,则模除的结果为正数或零;如果 % 左边的操作数是负数,则模除的结果为负数或零。例如: 15 % 2 // 余 1 15 % -转载 2015-04-10 10:26:13 · 2219 阅读 · 0 评论 -
C++构造函数详解及显式调用构造函数
c++类的构造函数详解 一、 构造函数是干什么的class Counter{public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0;转载 2015-04-10 13:34:57 · 627 阅读 · 0 评论 -
函数声明和函数定义中的默认参数浅析
默认参数是存在于函数的声明中,还是函数的定义中呢? 我在VS6.0和VS2008下做了如下实验,并做出了简单的总结,有不足或者不准确的地方,欢迎大家拍砖,我会及时修正相关内容。 实验一:默认参数不能同时存在于函数声明和函数定义中。#include iostream>#include tchar.h>using转载 2015-04-10 14:01:11 · 474 阅读 · 0 评论