c++笔记:(1)

1.C++ 指针运算符(& 和 *)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int main ()
{
int var;
int *ptr;
int val;
var = 3000;
// 获取 var 的地址
ptr = &var;
// 获取 ptr 的值
val = *ptr;
cout << "Value of var :" << var << endl;
cout << "Value of ptr :" << ptr << endl;
cout << "Value of val :" << val << endl;
return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
Value of var :3000
Value of ptr :0xbff64494
Value of val :3000

2.无限循环

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main ()
{
for( ; ; )
{
printf("This loop will run forever.\n");
}
return 0;
}

注意:您可以按 Ctrl + C 键终止一个无限循环。

3.C++ 随机数

在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。

下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:
实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdlib.h>
#include <stdio.h>
#include <time.h> /*用到了time函数,所以要有这个头文件*/
#define MAX 10
int main( void)
{
int number[MAX] = {0};
int i;
srand((unsigned) time(NULL)); /*播种子*/
for(i = 0; i < MAX; i++)
{
number[i] = rand() % 100; /*产生100以内的随机整数*/
printf("%d ", number[i]);
}
printf("\n");
return 0;
}
1
2
3
正在启动:/home/kuo/projects/test/build/test
36 32 0 2 45 89 48 73 93 79
*** 正常退出 ***

4.关于“using namespace std”

 对于一个存在着标准输入输出的C++控制台程序,一般会在#include 的下一行发现一句话,using namespace std。这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。
  1. 关于namespace
  C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象。解决方法就是加上自己的命名空间。比如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
namespace ZhangSan
{
int a=10; //张三把10赋值给了变量a
}
namespace LiSi
{
int a=5; //李四把10赋值给了变量a
}
int main ()
{
int a=1;
cout<<"张三定义的a="<<ZhangSan::a<<endl;
cout<<"李四定义的a="<<LiSi::a<<endl;
cout<<"主函数定义的a="<<a<<endl;
}

运行结果为:

1
2
3
4
5
正在启动:/home/kuo/projects/test/build/test
张三定义的a=10
李四定义的a=5
主函数定义的a=1
*** 正常退出 ***

  上例中的“ZhangSan::a”和“LiSi::a”分别表示了调用张三命名空间中的a变量和李四命名空间中的a变量。这样的好处显而易见,那就是虽然张三和李四这两个程序员都定义了一个变量a,但是并不会出现重名的危险。

5.#include<iostream>#include<iostream.h>的区别

  区别在于:如果用了isotream则一定要引入命名空间,即”using namespace std;
  
  如果用了iostream.h,则不能引入命名空间,否则会引起编译错误,提示找不到命名空间.

例程如下:

情况一:

1
2
3
4
5
6
7
8
//情况一:使用<iostream>和命名空间
#include <iostream>
using namespace std;
int main()
{
cout<<"<iostream> need to use namespace std!\n";
return 0;
}

输出:

1
2
<iostream> need to use namespace std!
Press any key to continue

情况二:

1
2
3
4
5
6
7
8
//情况二:使用<iostream.h>,不引入命名空间
#include <iostream.h>
//using namespace std;
int main()
{
cout<<"<iostream> need to use namespace std!\n";
return 0;
}

输出:

1
2
<iostream> need to use namespace std!
Press any key to continue

情况三:

1
2
3
4
5
6
7
8
//情况三:使用<iostream.h>,引入命名空间,这时候编译出错
#include <iostream.h>
using namespace std;
int main()
{
cout<<"<iostream> need to use namespace std!\n";
return 0;
}

编译错误信息:

1
2
3
4
5
6
7
8
9
10
11
error C2871: 'std' : does not exist or is not a namespace
```   
  转自:http://blog.csdn.net/jzjwonderful/article/details/47866773
  
# 6.C++ 数组
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

#include
using namespace std;

#include
/主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文/

using std::setw; / setw(n) 设域宽为n个字符 /

int main ()
{
int n[ 10 ]; // n 是一个包含 10 个整数的数组

// 初始化数组元素
for ( int i = 0; i < 10; i++ )
{
n[ i ] = i + 100; // 设置元素 i 为 i + 100
}
cout << “Element” << setw( 13 ) << “Value” << endl;

// 输出数组中每个元素的值
for ( int j = 0; j < 10; j++ )
{
cout << setw( 7 )<< j << setw( 13 ) << n[ j ] << endl;
}

return 0;
}

1
输出:

正在启动:/home/kuo/projects/test/build/test
Element Value
0 100
1 101
2 102
3 103
4 104
5 105
6 106
7 107
8 108
9 109
正常退出

1
2
## 6.1 C++ 多维数组

#include
using namespace std;

int main ()
{
// 一个带有 5 行 2 列的数组
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};

// 输出数组中每个元素的值
for ( int i = 0; i < 5; i++ )
for ( int j = 0; j < 2; j++ )
{
cout << “a[“ << i << “][“ << j << “]: “;
cout << a[i][j]<< endl;
}

return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
输出:
```c++
正在启动:/home/kuo/projects/test/build/test
a[0][0]: 0
a[0][1]: 0
a[1][0]: 1
a[1][1]: 2
a[2][0]: 2
a[2][1]: 4
a[3][0]: 3
a[3][1]: 6
a[4][0]: 4
a[4][1]: 8
*** 正常退出 ***

6.2 C++ 指向数组的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
int main ()
{
// 带有 5 个元素的整型数组
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double *p; /*double *[p] 的意思是定义双精度指针变量p */
p = balance; /*因为balance既是数组变量,也是指向数组第0个元素的指针变量*/
// 输出数组中每个元素的值
cout << "使用指针的数组值 " << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
}
cout << "使用 balance 作为地址的数组值 " << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "*(balance + " << i << ") : ";
cout << *(balance + i) << endl;
}
return 0;
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
正在启动:/home/kuo/projects/test/build/test
使用指针的数组值
*(p + 0) : 1000
*(p + 1) : 2
*(p + 2) : 3.4
*(p + 3) : 17
*(p + 4) : 50
使用 balance 作为地址的数组值
*(balance + 0) : 1000
*(balance + 1) : 2
*(balance + 2) : 3.4
*(balance + 3) : 17
*(balance + 4) : 50
*** 正常退出 ***

6.3 C++ 传递数组给函数

C++ 不允许向函数传递一个完整的数组作为参数,但是,您可以通过指定不带索引的数组名来传递一个指向数组的指针。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
// 函数声明
double getAverage(int arr[], int size);
int main ()
{
// 带有 5 个元素的整型数组
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
// 传递一个指向数组的指针作为参数
avg = getAverage( balance, 5 ) ;
// 输出返回值
cout << "平均值是:" << avg << endl;
return 0;
}
//子函数:应用于求数组的指定元素的平均值;
double getAverage(int arr[], int size) //传递数组的首地址和个数
//还可以以这样的形式:void myFunction(int *param)
{
int i, sum = 0;
double avg;
for (i = 0; i < size; ++i)
{
sum += arr[i];
}
avg = double(sum) / size;
return avg;
}

输出:

1
2
3
正在启动:/home/kuo/projects/test/build/test
平均值是:214.4
*** 正常退出 ***

6.4 C++ 从函数返回数组

C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。

如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:

1
2
3
4
5
6
int * myFunction()
{
.
.
.
}

另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

现在,让我们来看下面的函数,它会生成 10 个随机数,并使用数组来返回它们,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
// 要生成和返回随机数的函数
int * getRandom( )/*如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数*/
{
static int r[10];/*C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。*/
// 设置种子
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
// 要调用上面定义函数的主函数
int main ()
{
// 一个指向整数的指针
int *p;
p = getRandom();
for ( int i = 0; i < 10; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
}
return 0;
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
正在启动:/home/kuo/projects/test/build/test
1643684660
555897083
1283025333
67400210
154404676
2092591326
1876825200
1608593253
1393148894
621522198
*(p + 0) : 1643684660
*(p + 1) : 555897083
*(p + 2) : 1283025333
*(p + 3) : 67400210
*(p + 4) : 154404676
*(p + 5) : 2092591326
*(p + 6) : 1876825200
*(p + 7) : 1608593253
*(p + 8) : 1393148894
*(p + 9) : 621522198
*** 正常退出 ***

7.C++ 字符串

C++ 提供了以下两种类型的字符串表示形式:

C 风格字符串
C++ 引入的 string 类类型

7.1 C 风格字符串

C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
char str1[11] = "Hello";
char str2[11] = "World";
char str3[11];
int len ;
// 复制 str1 到 str3
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
// 连接 str1 和 str2
strcat( str1, str2);
cout << "strcat( str1, str2): " << str1 << endl;
// 连接后,str1 的总长度
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
1
2
3
4
5
正在启动:/home/kuo/projects/test/build/test
strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10
*** 正常退出 ***

其他:
|—|—|—|
| - - - | : - - - : | - - - |
| 4 | strcmp(s1,s2); |如果 s1 和 s2 是相同的,则返回 0;如果 s1 < s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
| 5 | strchr(s1, ch); | 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
|6 | strstr(s1, s2); |返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。|

7.2 C++ 中的 String 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
using namespace std;
int main()
{
//定义一个string类对象
string http = "www.runoob.com";
//打印字符串长度
cout<<http.length()<<endl;
//拼接
http.append("/C++");
cout<<http<<endl; //打印结果为:www.runoob.com/C++
//删除
int pos = http.find("/C++"); //查找"C++"在字符串中的位置
cout<<pos<<endl;
http.replace(pos, 4, ""); //从位置pos开始,之后的4个字符替换为空,即删除
cout<<http<<endl;
//找子串runoob
int first = http.find_first_of("."); //从头开始寻找字符'.'的位置
int last = http.find_last_of("."); //从尾开始寻找字符'.'的位置
cout<<http.substr(first+1, last-first-1)<<endl; //提取"runoob"子串并打印
return 0;
}
1
2
3
4
5
6
7
正在启动:/home/kuo/projects/test/build/test
14
www.runoob.com/C++
14
www.runoob.com
runoob
*** 正常退出 ***

转自:http://www.runoob.com/cplusplus/cpp-strings.html