Skip to content

Commit

Permalink
added new 3 chapters
Browse files Browse the repository at this point in the history
  • Loading branch information
andycai committed Jan 16, 2013
1 parent d07e42f commit 677b933
Show file tree
Hide file tree
Showing 5 changed files with 277 additions and 2 deletions.
11 changes: 10 additions & 1 deletion 00.md
@@ -1,4 +1,13 @@
# 目录 Table Of Contents

1. [Chapter 1 - const, inline,static, this](01.md)
2. [Chapter 2 - new, delete](02.md)
2. [Chapter 2 - pointers, refrence](02.md)
3. [Chapter 3 - char*, char[], string](03.md)
4. [Chapter 4 - uint8_t, uint16_t, uint32_t, uint64_t](04.md)
5. [Chapter 5 - new, delete](02.md)
6. [Chapter 6 - Function](03.md)
7. [Chapter 7 - Templates](04.md)
8. [Chapter 8 - STL](05.md)
9. [Chapter 9 - Boost](06.md)
10. [Chapter 10 - Pointers & Arrays](07.md)
11. [Chapter 11 - Class](08.md)
2 changes: 1 addition & 1 deletion 01.md
Expand Up @@ -204,4 +204,4 @@ MovePoint 函数的原型应该是 void MovePoint( Point *this, int a, int b);

## 导航
* [目录](00.md)
* 下一章:[](01.md)
* 下一章:[Chapter 2 - pointers, refrence](02.md)
80 changes: 80 additions & 0 deletions 02.md
@@ -0,0 +1,80 @@
# Chapter 2 - pointers, refrence

## 2.1 refrence 引用

引用是C++中的概念,初学者容易把引用和指针混淆一起。以下程序中,n 是 m 的一个引用(reference),m 是被引用物(referent)。

int m;
int &n = m;

n 相当于 m 的别名(绰号),对 n 的任何操作就是对m的操作。所以 n 既不是 m 的拷贝,也不是指向 m 的指针,其实 n 就是 m 它自己。

**引用的规则:**

- 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
- 不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
- 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

以下示例程序中,k 被初始化为 i 的引用。语句 k = j 并不能将 k 修改成为 j 的引用,只是把 k 的值改变成为6。由于 k 是 i 的引用,所以 i 的值也变成了6。

int i = 5;
int j = 6;
int &k = i;
k = j; // k和i的值都变成了6;

**引用的主要功能是传递函数的参数和返回值**

C++语言中,函数的参数和返回值的传递方式有三种:**值传递、指针传递和引用传递**

### (1) 以下是"值传递"的示例程序

由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。

void Func1(int x)
{
x = x + 10;
}
...
int n = 0;
Func1(n);
cout << "n = " << n << endl; // n = 0

### (2) 以下是"指针传递"的示例程序

由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10。

void Func2(int *x)
{
(* x) = (* x) + 10;
}
...
int n = 0;
Func2(&n);
cout << "n = " << n << endl; // n = 10

### (3) 以下是"引用传递"的示例程序

由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n,所以n的值成为10。

void Func3(int &x)
{
x = x + 10;
}
...
int n = 0;
Func3(n);
cout << "n = " << n << endl; // n = 10

对比上述三个示例程序,**会发现"引用传递"的性质象"指针传递",而书写方式象"值传递"**

实际上"引用"可以做的任何事情"指针"也都能够做,为什么还要"引用"这东西?
答案是"用适当的工具做恰如其分的工作"。

指针能够毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险。

如果的确只需要借用一下某个对象的"别名",那么就用"引用",而不要用"指针",以免发生意外。

## 导航
* [目录](00.md)
* 上一章:[Chapter 1 - const, inline,static, this](01.md)
* 下一章:[Chapter 3 - char*, char[], string](03.md)
121 changes: 121 additions & 0 deletions 03.md
@@ -0,0 +1,121 @@
# Chapter 3 - char*, char[], string

## 3.1 char*, char[], string

在C中,并没有字符串这个数据类型,而是使用字符数组来保存字符串。C字符串实际上就是一个以null('\0')字符结尾的字符数组,null字符表示字符串的结束。需要注意的是:只有以null字符结尾的字符数组才是C字符串,否则只是一般的C字符数组。

C字符串定义时可以利用"="号进行初始化,但是以后不能利用"="对C字符串进行赋值。对C字符串的操作需要通过"string"文件中定义的字符串处理函数。例如:

//字符串的初始化
char a[11] = "huanying";
//字符串的赋值
strcpy(a,"nihao")
//获取字符串的长度,不包括'\0'在内
strlen(a);
printf("%s",a);

在C中也可以使用字符指针来访问一个字符串,通过字符指针指向存放字符串数组的首元素地址来进行访问.
char *a = "nihao";
printf("%s",a);

在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作。以下是C字符串和C++中string的区别:

C字符串 string对象
所需的头文件名称 <string>或<string.h> <string>或<string.h>
为什么需要头文件 为了使用字符串函数 为了使用string类
如何声明 char name[20]; string name;
如何初始化 char name[20]="nihao"; string name = "nihao";
必须声明字符串长度么? 是 否
使用一个null字符么? 是 否
怎样实现字符串赋值 strcpy(name,"John"); name = "John";
其他优点 更快 更易于使用,优选方案
可以赋一个比现有字符更 不能 可以
长的字符串么?

### (1) C++常用字符串函数

char s1[]="I am a student";
char s2[20]="teacher";
char s3[]="student";
int result;
char s4[20],*p;

1. 串长度 int strlen(char *str)

cout<<strlen(s1)<<endl; 输出14
cout<<strlen(s2)<<endl; 输出7

2. 串拷贝 char *strcpy(char *str1,char *str2)

strcpy(s4,s2); //s4为"teacher"

3. 串连接 char *strcat(char *str1,char*str2)

strcat(s2,s3); //s2为"teacherstudent"

4. 串比较 int strcmp(char *str1,char *str) //比较的是对应字符的ASCII码值,如果str1>str2,返回1

result=strcmp(s2,s3); //result>0
result=strcmp(s2,s2); //result=0
result=strcmp(s3,s2); //result<0

5. 串定位 char *strchr(char *str,char ch)

p=strchr(s1,'s'); //找到返回字符在字串中的位置,否则返回-1
strcpy(p,s2); //s1为"I am a teacher"

6. 在一个串中查找是否存在和另一个串相等的子串

7. 截取子串形成一个新串

### (2) 字符串的输入

1. 方法一:使用输入操符来填充一个C字符串变量
例如:
char a[80];
cin>>a;
注:以这种方式来读取C字符串时,会忽略最初的空白字符(空格、制表符和换行符),而且输入会在下一个空格或者换行符处停止。

2. 方法二:使用预定义函数getline获取整行输入(包括空格)
getline函数有两个参数:第一个参数用于接收输入的C字符串变量;第二个参数用于规定getline最多能接收的字符个数。
例如:
char a[80];
cin.getline(a,80);
当遇到行结束的时候,输入才会停止。

### (3) C++ string类的输入

1. 方法一:和C字符串输入的方法一相同。
2. 方法二:使用getline函数。

例如:

string a;
getline(cin,a);

### (4) string对象和C字符串之间的转换

可以将C字符串存储在string类型的变量中,例如:

char a[] = "nihao";
string b;
b=a;

但string对象不能自动的转换为C字符串,需要进行显式的类型转换,需要用到string类的成员函数c_str().
例如:

strcpy(a,b.c_str());


### (5) 字符串到数字的转换

atoi函数获取一个C字符串参数,返回对应的int值。如果参数不与一个int值对应,atoi就会返回0。atoi函数在文件为cstdlib的库中。如果数字太大,不能转换成int类型的值,可以使用atol将字符串转换为long类型的值。
例如:

atoi("1234"); //返回整数1234
atoi("#123"); //返回0

## 导航
* [目录](00.md)
* 上一章:[Chapter 2 - pointers, refrence](02.md)
* 下一章:[Chapter 4 - uint8\_t, uint16\_t, uint32\_t, uint64\_t](04.md)
65 changes: 65 additions & 0 deletions 04.md
@@ -0,0 +1,65 @@
# Chapter 4 - uint8\_t, uint16\_t, uint32\_t, uint64\_t

uint8\_t, uint16\_t, uint32\_t, uint64\_t 是什么数据类型?

那么_t的意思到底表示什么?它就是一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。

uint8\_t,uint16\_t,uint32\_t 等都不是什么新的数据类型,它们只是使用typedef给类型起的别名,新瓶装老酒的把戏。不过,不要小看了typedef,它对于你代码的维护会有很好的作用。比如C中没有bool,于是在一个软件中,一些程序员使用int,一些程序员使用short,会比较混乱,最好就是用一个typedef来定义,如:

typedef char bool;

一般来说,一个C的工程中一定要做一些这方面的工作,因为你会涉及到跨平台,不同的平台会有不同的字长,所以利用预编译和typedef可以让你最有效的维护你的代码。为了用户的方便,**C99标准的C语言**硬件为我们定义了这些类型,我们放心使用就可以了。

按照posix标准,一般整形对应的*_t类型为:

1字节 uint8_t
2字节 uint16_t
4字节 uint32_t
8字节 uint64_t

附:C99标准中inttypes.h的内容

00001 /*
00002 inttypes.h
00003
00004 Contributors:
00005 Createdby Marek Michalkiewicz <marekm@linux.org.pl>
00006
00007 THISSOFTWARE IS NOT COPYRIGHTED
00008
00009 Thissource code is offered for use in the public domain. You may
00010 use,modify or distribute it freely.
00011
00012 Thiscode is distributed in the hope that it will be useful, but
00013 WITHOUTANY WARRANTY. ALLWARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
00014 DISCLAIMED. This includes but is not limited towarranties of
00015 MERCHANTABILITYor FITNESS FOR A PARTICULAR PURPOSE.
00016 */
00017
00018 #ifndef __INTTYPES_H_
00019 #define __INTTYPES_H_
00020
00021 /* Use [u]intN_t if you need exactly N bits.
00022 XXX- doesn't handle the -mint8 option. */
00023
00024 typedefsigned char int8_t;
00025 typedefunsigned char uint8_t;
00026
00027 typedefint int16_t;
00028 typedefunsigned int uint16_t;
00029
00030 typedeflong int32_t;
00031 typedefunsigned long uint32_t;
00032
00033 typedeflong long int64_t;
00034 typedefunsigned long long uint64_t;
00035
00036 typedefint16_t intptr_t;
00037 typedefuint16_t uintptr_t;
00038
00039 #endif

## 导航
* [目录](00.md)
* 上一章:[Chapter 3 - char*, char[], string](03.md)
* 下一章:[Chapter 5 - new, delete](05.md)

0 comments on commit 677b933

Please sign in to comment.