C/C++之学习笔记

C语言的Static inline 函数的作用

【printf打印格式】

%x  打印十六进制

%d 打印十进制

%b 打印二进制

%c 打印字符

%s 打印字符串

%f 打印单精度float

%lf 打印双精度double

【关于C++中的类型转换】

dynamic_cast: 通常在基类和派生类之间转换时使用,把一个派生类转换为基类使用这个转换,run-time cast

const_cast: 转换是去掉const变量的const, 主要针对const和volatile的转换.

static_cast: 一般的转换,类似于C/C++里面的强制类型转换。no run-time check.通常,如果你不知道该用哪个,就用这个。

reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。

 

【位域问题】

#include <stdio.h>

int main(void)

{

struct bs{

unsigned a:1;   //a 变量取值为0,1

unsigned b:3;  //b 变量取值为0到2的3次方-1

unsigned c:4;  //c 变量取值为0到2的4次方-1

} bit, *pbit;

bit.a = 1;

bit.b = 7;

bit.c = 15;

printf("%d,%d,%d \n",bit.a,bit.b,bit.c);

pbit = &bit;

pbit->a = 0;

pbit->b &= 3;

pbit->c |= 1;

printf("%d,%d,%d \n",pbit->a,pbit->b,pbit->c);

//printf("the aaa struct sizeof: %d\n", sizeof(data));

return 0;

}

 

 

【位移运算】

<< 左移运算

#include

<stdio.h>

int

mainvoid)

{

size_t a = 2;

printf(

"a<<3 = %d\n",a<<3);

return 0;

}

结果: a*(2*2*2) = 16

 

>> 右移运算

     #include <stdio.h>

      int mainvoid)

{

size_t a = 16;

printf( "a>>3 = %d\n",a>>3);

return 0;

}

结果:a/(2*2*2) = 2

 

【避免重复的编译的宏定义】

#ifndef _TEST_HEAD_H_

#define _TEST_HEAD_H_

代码体......

#endif

【C和C++混合编译的宏定义】

#ifdef __cplusplus

extern "C" {

#endif

代码体......

#ifdef __cplusplus

}

#endif

【C语言注释标准】

单行:

/** The length of the activequeues array */

多行:

/** The length of the activequeues array

*    The length of the activequeues array

*/

【宏定义】

(1)、Windows编译器判断

#ifdef WIN32

/* If we‘re on win32, then file descriptors are not nice low densely packed

integers.  Instead, they are pointer-like windows handles, and we want to

use a hashtable instead of an array to map fds to events.

*/

#define EVMAP_USE_HT

#endif

(2)、宏定义判断

#ifdef EVMAP_USE_HT

#include "ht-internal.h"

struct event_map_entry;

HT_HEAD(event_io_map, event_map_entry);

#else

#define event_io_map event_signal_map

#endif

【位运算】

  1. and运算

and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。

这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。

相同位的两个数字都为1,则为1;若有一个不为1,则为0。  00111  11100  (&;或者and)  ----------------  00100

2. or运算

or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。

如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。

相同位只要一个为1即为1。  00111  11100  (|或者or)  ----------------  11111

3. xor运算

异或的符号是⊕。  xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。

xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。

xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥

1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企图。

相同位不同则为1,相同则为0。  00111  11100  (^或者xor)  ----------------  11011

【进制】

9、C语言中使用16进制

至于宏定义为什么喜欢定义成 0xf 什么的,还有经常看到定义成0x00000001 这种形式的。

首先计算机运算全是通过2进制进行的,所以把16进制(0x 代表这个数是16进制的)转换成2进制,那么f 就是 1111。

c语言基础教程书上都有这么一课,就是位运算,"|","&", 等等操作符。当表现一个对象有几种属性时候,它可以并列拥有几种属性,比如一件衣服,他可以是蓝色(定义蓝色为 0001 即0x1),红色(定义红色为0010,即0x2),

黑色(定义为0100,即0x4),白色(1000,0x8)

所以当你看到这件衣服时候,有个表示告诉你他的属性是0xf,即1111,就表示4种颜色它全具备,如果属性是0xa,即1001,那表示它具有 蓝色 和 白色 2种属性。

这么讲比较通俗点吧。。。。至于宏定义为什么喜欢定义成 0xf 什么的,还有经常看到定义成0x00000001 这种形式的。

首先计算机运算全是通过2进制进行的,所以把16进制(0x 代表这个数是16进制的)转换成2进制,那么f 就是 1111。

c语言基础教程书上都有这么一课,就是位运算,"|","&", 等等操作符。当表现一个对象有几种属性时候,它可以并列拥有几种属性,比如一件衣服,他可以是蓝色(定义蓝色为 0001 即0x1),红色(定义红色为0010,即0x2),

黑色(定义为0100,即0x4),白色(1000,0x8)

所以当你看到这件衣服时候,有个表示告诉你他的属性是0xf,即1111,就表示4种颜色它全具备,如果属性是0xa,即1001,那表示它具有 蓝色 和 白色 2种属性。

这么讲比较通俗点吧。。。。

【链表】

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

基本原理:

1、 单链表:每一个节点里存到下一个节点的指针(Pointer)

2、 循环链表:

循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。

 

循环链表的运算与单链表的运算基本一致。所不同的有以下几点:

1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。

2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。

3、 双向链表:

双向链表其实是单链表的改进。

当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表

在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。

设计实现:

 

【栈】

基本原理:后进先出的规则

1 顺序栈:使用数组实现顺序存储数据

2 链栈:使用指针实现链式存储数据

设计实现:

########################################################################################

【队列】

########################################################################################

【内存分配】

realloc

extern void *realloc(void *mem_address, unsigned int newsize);

语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!

头文件:#include <stdlib.h> 有些编译器需要#include <malloc.h>,在TC2.0中可以使用alloc.h头文件

功能:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

注意:这里原始内存中的数据还是保持不变的。当内存不再使用时,应使用free()函数将内存块释放。

calloc是一个ISO C函数

函数名: calloc

函数原型:void *calloc(unsigned n, unsigned size);

功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

malloc的区别:

calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

时间: 2024-11-08 14:53:13

C/C++之学习笔记的相关文章

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

[原创]java WEB学习笔记12:一个简单的serlet连接数据库实验

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------