C++ 随机数
在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数
C++数组
声明数组
type arrayName [ arraySize ];
初始化数组
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0}; double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
访问数组元素
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边
数组参数的传递
形式参数是一个指针——指向首地址 void myFunction(int *param) { } 形式参数是一个已定义大小的数组: void myFunction(int param[10]) { } 形式参数是一个未定义大小的数组: void myFunction(int param[]) { } 调用: 调用的时候实参直接填写数组名即可
C++数组变型
多维数组
声明
type name[size1][size2]...[sizeN]; int threedim[5][10][4];
初始化
int a[3][4] = { {0, 1, 2, 3} , /* 初始化索引号为 0 的行 */ {4, 5, 6, 7} , /* 初始化索引号为 1 的行 */ {8, 9, 10, 11} /* 初始化索引号为 2 的行 */ }; int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
指向数组的指针
传递数组给函数
从函数返回数组
C++ 字符串
字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
声明及初始化创建
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; char greeting[] = "Hello";
C++ 中的 String 类
- 1. append() -- 在字符串的末尾添加字符
- 2. find() -- 在字符串中查找字符串
- 4. insert() -- 插入字符
- 5. length() -- 返回字符串的长度
- 6. replace() -- 替换字符串
- 7. substr() -- 返回某个子字符串
指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var-name; int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
C++ Null 指针
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。NULL 指针是一个定义在标准库中的值为零的常量
int *ptr = NULL;
如需检查一个空指针,您可以使用 if 语句,如下所示:
if(ptr) /* 如果 ptr 非空,则完成 */ if(!ptr) /* 如果 ptr 为空,则完成 */
C++ 指针的算术运算
ptr++:它的取值跟定义的数据类型有关,如果指向的是一个整数,则下一次会指向下一个整数的位置,所以地址的值+4;如果是字符类型,则会+1;注意地址+1代表移动一个数据类型的长度。*ptr是取ptr地址处数据的长度
int height[10];//int型的数组 cout << &height << endl;//&用在数组名上 cout << &height[0] << endl;//&用在数组第一个元素上
上面 &height[0] 就是取得是数组第一个元素的地址,假设地址为 1000;&height 是直接对数组名进行取地址,这个时候就是取得是 height 整个数组的地址,指向包含 10 个元素的 int 型数组,地址范围为 1000~1036;我们知道 height 等价于 &height[0],height+1 会将地址加 4 个字节;但 &height+1 就是将地址增加 10*4 个字节。
C++ 指针 vs 数组
只要var的值(地址)不变,那么相应位置的数值改变了,该数组的地址也不会受到影响。
int var[MAX] = {10, 100, 200}; cout<<var<<endl; //0x7ffda7291170 cout<<*var<<endl; //10 for (int i = 0; i < MAX; i++) { *var = i; // 这是正确的语法;实际上是改变了数组中的第一个元素的值;每次循环都是一样的 cout<<*var<<endl; //0 cout<<i<<endl; //0 cout<<&i<<endl; //0x7ffda729116c 接下来的循环;值不变 cout<<var<<endl; //0x7ffda7291170 接下来的循环;值不变
var++ 实际上是 var=var+1,而var是常量,不能出现在=(赋值符号)的左边,但是 *(var+i)、&var[i]都是允许的
int main () { int var[3] = {10,100,200}; int *p=var; for (int i = 0; i < 3; i++) { cout << *(var++) << endl; //编译错误,因为var是数组名(也是数组首元素地址),不是一个变量,不可修改其值 cout << *(var+i) << endl; //编译正确,因为没有对var进行赋值,只是通过与i相加访问变量地址 cout<< *(p++)<<endl; ///编译正确,p为指针变量可赋值 } return 0; }
指针数组
声明:
int *ptr[MAX]; ptr是一个数组,但是其中ptr的每个元素,都是一个指向 int 值的指针
指针;指针数组;数组指针区别
C++ 的运算符优先级顺序和C的不一样,有细微差别。
int *ptr[3]; 由于 C++ 运算符的优先级中,* 小于 [],所以 ptr 先和 [] 结合成为数组 然后再和 int * 结合形成数组的元素类型是 int * 类型,得到一个叫一个数组的元素是指针 简称指针数组。 int *(ptr[3]); 这个和上面的一样,优先级顺序是 * 小于 (),() 等于 []。ptr 先和 [] 结合成为数组 然后再和 int * 结合形成数组的元素类型是 int * 类型,得到一个叫一个数组的元素是指针 也是指针数组 int (*ptr)[3]; 这个就不一样了,优先级顺序是 * 小于 (),() 等于 [],() 和 [] 的优先级一样, 但是结合顺序是从左到右,所以先是 () 里的 * 和 ptr 结合成为一个指针, 然后是 (*ptr) 和 [] 相结合成为一个数组,最后叫一个指针 ptr 指向一个数组,简称数组指针 括号优先级较高
C++ 指向指针的指针(多级间接寻址)
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置
声明
int **var;
其实二级地址和一级地址相同
C++ 传递指针给函数