从零开始学习c++之初识指针和引用

来源:互联网 发布:ubuntu 网络设置 编辑:程序博客网 时间:2024/06/14 08:06

指针:

指针(pointer) 是一个值为内存地址的变量   内存地址一般使用16进制表示比如0028FF44

指针的本质只是一个变量,指针大小为4个字节

指针的声明:

        //第一种声明方式int* ptr_i1;    //偏向于地址,p理解为一个地址变量,int*是类型   //第二种声明方式int *ptr_i2;   //偏向于值,*p理解为一个int型变量,能表示一个整型值//其他两种声明方式int * ptr_i3;int*ptr_i4;
关于指针声明方式*位置的不同:一元运算符*是间接寻址或间接引用运算符,当它作用于指针时,将访问指针所指向的对象。

int *ptr这样声明时便于记忆,该声明的表达式*ptr的结果是int类型,一般使用这种声明方式。


指针的赋值:

        int i1;      //变量i1 = 100;        ptr_i1 = &i1;    //&表示获取地址变量*ptr_i1 = 200;         //*表示取地址变量所对应的变量cout << *ptr_i1<<endl;   //输出200  cout << i1<<endl;        //输出200
为指针赋值时,赋值运算符右侧必须是一个地址

指针类型:

        //1.空指针//一般指针初始化值为nullptr 必须初始化所有指针int *ptr1 = nullptr;       //等价于 int *ptr1= 0;       nullptr特殊的字面量的值,可以转化为任意指针类型//指针也可以赋值NULL 等价于nullptr 但需要包含头文件cstdlibint *ptr2 = NULL;cout << endl;//2.void *指针//void*指针存放一个内存地址,地址指向的内容是什么类型不能确定,所以用void*指针取得的变量不能修改变量值//void*指针一般用途:用于和别的指针比较、作为函数的输入和输出、赋值给另一个void*指针double num = 3.14;double *ptrNum1 = #void *ptrVoid1 = #cout << (ptrVoid1 == ptrNum1);//*ptrVoid1 = 4.11;        //无法这样修改,因为void*指针类型不确定 报错:表达式必须是指向完整对象类型的指针

指针与数组:

        //数组存储在一块连续的内存空间,数组名是这块连续内存空间的首地址double nums[5] = { 23,52,77,25,89 };double *ptrNum = nullptr;ptrNum = nums;    //直接指向数组//ptrNum = &nums[5];    //指向数组某个元素cout << ptrNum[3] << endl;     //当指针指向某一个数组,指针可以视为数组使用,因为数组名等于数组的首地址cout << sizeof(ptrNum) << endl;        //输出为4     指针变量占4个字节

指针的递增和递减:

        double scores[5] = { 55,29,19,66,82 };double *ptr_scores;ptr_scores = scores;for (int i = 0;i < 5;i++){cout << *ptr_scores++ << endl;            //指针的++和--相当于指针在内存空间的平移,移动单位为T的大小}cout << endl;ptr_scores -= 2;    cout << *ptr_scores << endl;           //输出66

引用:

        //引用:为对象起了另外一个名字int value = 1024;int &refValue = value;        //refValue 指向value,是value的引用//错误引用: int &refValue2;      //引用必须被初始化//注意:引用并非对象,只是对一个已经存在的对象起的别名//引用只能绑定在对象上,不能指向一个字面值或者表达式  //错误写法:例如 int &refNum = 10; //但有一种情况可以把引用指向一个常量const double &refCon = 10;        //正确写法 表示常量引用//引用必须被初始化,所以使用引用前不需要测试有效性,使用引用比使用指针效率高

指针与引用的关系:

1.引用是一种进行了简单封装的引用
2.引用底层仍然是指针,获取引用地址时,编译器会进行内部转换
3.引用的直接目的是为了让代码编写更加流畅


指针的简单应用:

使用指针来对一个数组进行逆序操作:

        //逆序:首元素和尾元素交换int arrays[8]{ 25,29,8,18,53,44,65,32};int *ptr_start = arrays;       //一个指针指向第一个元素int startCount = 0;int *ptr_end = arrays + 7;     //另一个指针指向最后一个元素int endCount = 7;int temp = 0;       //临时变量用于交换while (ptr_start < ptr_end){temp = *ptr_start;*ptr_start = *ptr_end;*ptr_end = temp;ptr_start++;ptr_end--;cout << ptr_start << "\t" << ptr_end << endl;}for (int i = 0;i < sizeof(arrays) / sizeof(int);i++){cout << arrays[i] << endl;}

指针-自由空间分配:

        //使用new来请求系统系统从自由空间分配内存//new 返回一个指向分配的内存的指针int *p1 = new int;           //分配1个intint *p2 = new int[5];        //分配5个intdelete p1;    //释放由new分配的内存  //使用new创建动态分配的数组int *intArray = new int[10];//使用delete[]释放内存delete[] intArray;
delete和new的使用:
1.delete与new配对,不要使用delete释放不是new的内存   
2.不能释放已经释放的内存
3.使用delete[]来释放用new[]为数组分配的内存

原创粉丝点击