c++基础(七)

第一部分:数组的定义与使用

       数组的定义类型说明符 数组名[常量表达式][常量表达式]

       常量表达式说明的是数组每一维的下标个数。例如,int a[10],表示a为整型数组,有10个元素:a[0],a[1],…,a[9]。数组必须先定义后使用,可以逐个引用数组元素。当需要处理数组中的元素时,可以很方便地使用循环条件来进行处理。

案例:

#include<iostream>
using namespace std;
int main()
{
        int a[10], b[10];
        for (int i = 0; i < 10; i++)
        {
            a[i] = i * 2 - 1;
            b[10 - i - 1] = a[i];
        }
        for (int i = 0; i < 10; i++)
        {
            cout << "a[" << i << "]" << "=" << a[i] << '\t';
            cout << "b[" << i << "]" << "=" << b[i] <<endl;
        }
        system("pause");
        return 0;
}

 

一维数组的存储:数组元素在内存中顺序存放,他们的地址是连续的。例如int a[10],数组名字是数组首元素的内存地址,数组名是一个常量不能被赋值

       一维数组的初始化:1、列出全部元素的初始值;2、可以只给一部分元素指定初始值;3、列出全部元素的初始值时,可以不给出数组的长度。

       二维数组的存储:1、按行存放,可以将二维数组理解为由一维数组组成的数组,在内存中,二维数组的存放也是按照行来进行存放的。

二维数组的初始化:1、列出全部的初始值,将所有的初始值写在一个{}内,按照顺序初始化,例如,static int a[2][3]={1,2,3,4,5,6};2、分行列出二维数组的初值,如:static int a[2][3]={{1,2,3},{4,5,6}};3、只对部分元素初始化,static int a[3][4]={{1},{2,3},{5,7}};4、当列出全部的初始值时,第一维的下标个数可以省略,如:static int a[][3]={{1,2,3},{4,5,6}}。5、如果不作任何初始化,局部作用域内的非静态数组中会存在垃圾数据,static数组中的数据默认初始化为0;如果只对部分元素初始化,剩下的未显式初始化的元素将被初始化为0

案例:求斐波拉契数列的前20项,将结果打印出来。

公式:

数组作为函数参数:1、数组名做参数,形、实参数都是数组名,类型要一样,传送的是数组的首地址对形参数组的改变会直接影响到实参数组,因为数组名就是数组在内存中的地址,因此形实结合时是把数组的地址给了形参,形参指向的是实参数组,因此在函数中对形参数组的任何操作都会体现在实参数组中。

对象数组:

定义对象数组:类名数组名[元素个数],对象数组在定义时可以初始化。

访问对象数组的成员:数组名[下标].成员名

对象数组初始化:数组中的每一个元素被创建时,系统就会调用类的构造函数初始化该对象,我们可以通过初始化列表给对象的成员进行赋值,如果没有为数组元素指定显式初始值,数组元素便使用默认构造函数进行初始化。

基于范围的for循环:

C++11包含一种新的 for 循环,称为基于范围的 for 循环,可以简化对数组元素的遍历。格式如下:

for(Type VarName : Array)

{

    //每个元素的值会依次赋给 VarName

}

如for(int x:Array),Array里的值会依次赋给x,这里相当于值传递,如果我们给x加上修饰符,比如给x加上&,此时就相当于引用传递,对x的操作就相当于对Array里的元素进行操作。

 

第二部分:指针的概念、定义及指针运算

内存空间的访问方式:1、通过变量名访问;2、通过地址访问

当程序运行时必须用动态内存分配的时候,我们必须使用指针。

指针:内存地址,用于间接访问内存单元

指针变量:用于存放地址的变量

定义格式:数据类型 *指针变量名,例如:int a ; int *p=&a;指针变量名为p,p存储的是一个int类型变量a的地址;在定义指针时,一定要定义指针的数据类型(基类型),也就是其指向的对象的数据类型,因为只有指定了其数据类型时,才能够对其所指向的对象进行操作(因为不同类型的数据在内存中所占有的空间大小不同)。

指针运算符 *:根据这个指针变量中存储的地址去访问该地址存放的对象,也就是寻址的过程;

地址运算符 &:查找一个变量或对象的地址并取出这个变量或对象的的地址。

指针运算和地址运算互为逆运算。

指针变量的初始化:1、语法形式:存储类型 数据类型 指针名=初始地址。注意:用变量地址作为初始值时,该变量必须在指针初始化之前已经声明过,且变量类型与指针类型一致;不要用一个内部非静态变量去初始化static指针

指针变量的赋值:1、语法形式:指针名=地址;2、注意:向指针变量赋的值必须是地址常量或变量,不能是普通整数(0除外,此时表示空指针);允许定义或声明指向void类型的指针,该指针可以被赋予任何类型对象的地址,但是不能用该指针进行访问其所指向的内存空间。3、指针空值nullptr,表达更准确,类型安全的空指针,在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为指针。NULL 指针是一个定义在标准库中的值为零的常量,如果所有未使用的指针都被赋予空值,同时避免使用空指针,就可以防止误用一个未初始化的指针。很多时候,未初始化的变量存有一些垃圾值,导致程序难以调试。

指向常量的指针:const指针,不能通过指向常量的指针改变所指对象的值,但指针本身可以指向另外的对象。例如:int a = 2;const int *p1=&a;int b;p1 = &b;//*p1 = 1;不能通过指向常量的指针去改变变量的值。

指针类型的常量:若声明指针常量,则指针本身的值不能被改变。例如:int a; int *const p2 = &a;//p2 = &b;错误,p2是指针常量,值不能被改变。

指针的算数运算和关系运算:1、指针p加上或减去n:指针当前指向位置的前方或后方第n个数据的起始位置;2、指针的++、--运算:指向下一个或前一个完整数据的起始;3、当指针指向连续存储的同类型数据时,指针与整数的加减和自增自减运算才有意义。4、指向相同数据类型的指针之间可以进行各种关系运算,指针可以和0之间进行等于或者不等于的关系运算。

猜你喜欢

转载自www.cnblogs.com/puheng/p/9302611.html