C++ 小知识点总结

返回多个参数的方法:

1. 定义结构体

2. 利用引用参数

解决 “数组大小必须事先决定” 这个问题

1. 使用 new 和 delete,有程序员自行分配内

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> 
using namespace std;

int main () {
int size = 0;

cout << " 输入长度:";
cin >> size;
int *arr = new int [size]{0};

cout << " 输入元素值:" << endl;
for (int i = 0; i < size; i++) {
cout << "arr [" << i << "] =";
cin >> arr [i];
}

cout << " 显示元素值:" << endl;
for (int i = 0; i < size; i++) {
cout << "arr [" << i << "] =" << arr [i]
<< endl;
}

delete [] arr;

return 0;
}

注释:二维矩阵就是多段一维数组
例如需要一个 3X6 的矩阵

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
#include <iostream> 
using namespace std;

int main () {
int **arr = new int*[3]; //arr [0] 和 arr [1] 分别存储一维数组的位置

for (int i = 0; i < 3; i++) {
arr [i] = new int [6]{0};
}
// 既然可以动态分配,那每一段数组的长度当然可以不一样
//arr [0] = new int [3]{0};
//arr [1] = new int [5]{0};
//arr [3] = new int [3]{0};

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 6; j++) {
cout << arr [i][j] << " ";
}
cout << endl;
}

for (int i = 0; i < 3; i++) {
delete [] arr [i];
}
delete [] arr;

return 0;
}

2. 动态分配会使得程序难以理解,在需要建立长度不定的容器时,建议使用 vector 之类的容器

static 的使用时机

1. 改变变量的存储方式和生存周期

局部变量

2. 限制作用域

全局函数和变量

3. 唯一性

函数成员

堆和栈的比较

堆是由低地址向高地址扩充的

堆是不连续的空间

在申请空间后,栈的分配要比堆还快

生命周期

volatile

volatile 可以保证对特殊地址的稳定访问,通常用到如下几个地方

1. 中断服务程式修改的供其他程式检测的变量

2. 多工环境下各任务共享的标志

3. 存储器对应的硬体暂存器也要加 volatile 说明,因为每次对它的读写都可能有不同意义

输入

C++ 输入 cin,cin.get (),cin.getline () 详细比较及例子

https://blog.csdn.net/a1015553840/article/details/50579396
https://blog.csdn.net/liangjiubujiu/article/details/83347325

声明一个 char 数组,然后用 gets () 函数,要 #include

1
2
3
4
for (int i=0; words [i]!='\0'; i++)
{
...
}

因为 gets () 函数连空格也会接收,直到接收到 ‘\n’ 换行会停止
所以为了防止前面输入数据的换行被 gets () 接收,可以使用 char ch = getchar ();
或是 fflush (stdin); 清空缓存区(亲测无效,不知道为什么)

声明一个 string 变量,然后使用 cin

C++ 如何获取数组长度

sizeof (array) /sizeof (array [0])

C++ 如何求字符串长度

strlen ()

1
2
3
char str [20]="0123456789"; 
int a=strlen (str); //a=10;strlen 计算字符串的长度,以 \0' 为字符串结束标记。
//strlen 不区分是数组还是指针,就读到 \0 为止返回长度。而且 strlen 是不把 \0 计入字符串的长度的。
sizeof (...) 是运算符,在头文件中 typedef 为 unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。实际上,用 sizeof 来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof 返回的值表示的含义如下:
数组 —— 编译时分配的数组空间大小;
指针 —— 存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为 4);
类型 —— 该类型所占的空间大小;
对象 —— 对象的实际占用空间大小;
函数 —— 函数的返回类型所占的空间大小。函数的返回类型不能是 void。

sizeof ()

1
2
int   b=sizeof (str); //b=20;sizeof 计算的则是分配的数组 str [20] 占的内存空间的大小,不受里面存储的内容影响。
char str2 []="absde"; //sizeof (str2)=6,共有 a b s d e \0 六个字符。

string 类型的字符串

str.length () 和 str.size () 是用于求 string 类对象的成员函数

补充:string 字符串 ->c 字符串转换

string s1 = “far away”;
const char* c = s1.c_str ();

大小写转换

string 字符

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main ()
{
string str="how are you";
transform (str.begin (),str.end (),str.begin (),::toupper);
cout << str << endl;
return 0;
}

字符转换成数字

1
2
3
char ch = 'a';
int num = ch - 0;
cout << num << endl;

string 和 int 的转换

1
2
3
4
5
6
//int --> string
int i = 5;
string s = to_string (i);
//string --> int;
string s = "123.257";
cout << stoi (s) << endl;

atoi () 和 stoi () 的区别

相同点:

  1. 都是 C++ 的字符处理函数,把数字字符串转换成 int 输出
  2. 头文件都是 #include
    不同点:
    1.atoi () 的参数是 const char , 因此对于一个字符串 str 我们必须调用 c_str () 的方法把这个 string 转换成 const char 类型的,而 stoi () 的参数是 const string, 不需要转化为 const char
    2.stoi () 会做范围检查,默认范围是在 int 的范围内的,如果超出范围的话则会 runtime error;而 atoi () 不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界

26 个字母和数字符号 ASCII 码对照表

https://blog.csdn.net/Lucky_bo/article/details/52247939
http://www.eion.com.tw/Blogger/?Pid=1128

c++ 将一个 char 转化为 string

1
2
3
const char c = 'a';
// 使用 string 的构造函数
string s (1,c);

C++ learing 总览

C++ 四舍五入
C++ 取出一個數的每一位
C++ 利用 rand () 產生隨機數
C++ 小知识点总结
C++ 解釋一個語句
C++ #include
C++ RALL
C++ 运算符
C++ 万能标头档
讓 Dev C++ 支持 C++11