c++学习5
来源:互联网 发布:电力大数据应用 编辑:程序博客网 时间:2024/05/17 02:02
最近看了一本《c++必知必会》整理一下看的内容
1.指针和引用的区别
1.1不存在空引用
1.2所有引用都要初始化
1.3一个引用永远指向对它初始化的对象
2.一个指向非常量的引用是不可以用字面值或者临时值进行初始化的,但是一个指向常量的引用是可以的,相当于引用设置为指向一个“采用该字面值初始化”的临时位置
double &d=12.3//错误
const double & d=12.3//OK
3.数组会退化成指向其首元素的指针,丢失边界。函数形参会退化成函数指针,但可以保持其参数类型和返回类型
#include<iostream>
using namespace std;
void average(int arr[])
{
}
void average1(int (&arr)[10])//指定数组大小
{
}
void average2(int arr[],int size)//另传值指定数组大小
{
}
int main()
{
int arr[12];int arrr[10];int arrrr[3];
int * p=arrr;
average(arr);//不关心边界
average1(arrr);//关心边界值,边界值一致就正确
//average1(arr);//会报错
//average1(p);不能传指针,局限性
average2(arrrr,10);
return 0;
}
void average(int arr[10][20]) 也可以声明为void average(int (*arr)[20]),边界20不能退化,否则无法对形参执行指针算术
4.常量指针和指向常量的指针
const T * p=pt;//指向常量的指针
T const * p;//指向常量的指针 因为声明中的修饰符*之前出现的任何东西顺序无关,所以也可以这样写
T * const p=pt;//常量指针,指向一个非常量对象
形式1:
T * pt=new T;
const T * pct=pt;//可以用一个非常量指针赋值给常量指针,那么两个指针指向同一块内存。常量指针不会修改指向的内存中数值。只会因为非常量指向修改值而变化。
因此常见的情形
fun(const T * p1)调用时T * a=new T;fun(a);那么相当于形式1
形式2:
const T a;
const T * p1=&a;
T * p2=p1;//报错,因为如果让常量指针赋值给非常量指针,那么非常量指针可以修改指向的内存值,因此也修改了破坏了指向常量指针的内容
解决方法const_cast
p2=const_cast<T *>(p1);
*pt=a2;//试图修改常量对象
int main()
{
//情形2
const int * p1=new int;
//int * p2=p1;报错
int * p2=const_cast<int *>(p1);
//情形1
int * p3=new int;
const int * p4=p3;
printf("%d \n",*p4);
*p3=3;
//*p4=4;修改常量值是由非常量指针修改的,被动地修改了指向常量的指针的指向内容
printf("%d \n",*p4);
return 0;
}
5.指针的指针
1.当函数需要改变传递给它的指针的值时候,在c++更多地是使用指向指针的引用作为函数参数
#include<iostream>
using namespace std;
void fun(int * p)
{
p=p+2;
}
void fun2(int * &p)
{
p=p+2;
}
int main()
{
int arr[5]={1,2,3,4,5};
int * p=arr;
fun(p);
printf("%d\n",*p);//仍然指向第一个元素
fun2(p);//直接传入指针的指针,如果函数参数是指针的指针则fun2(&p)
printf("%d\n",*p);//指向第三个元素
return 0;
}
2.适用于指针的转换不一定适用于指针的指针
Circle * c=new Circle;
Shape * s=c;//正确
Circle * *cc=&c;
Shape * *ss=cc;//错误
char * s1=0;
const char * s2=s1;//指向非常量指针赋值给指向常量的指针
char * a[100[;
const char * * s3=a;//错误,不能把指向非常量的指针的指针赋值给指向常量的指针的指针
- c学习笔记(5)
- C 语言学习 5
- C语言学习5
- C#/.net学习-5
- Objective-C学习笔记(5)----学习SQLite3
- IOS学习---C语言基础学习5
- Esql/c 学习ing(5)
- C语言学习笔记(5)
- C语言学习笔记5
- C语言学习笔记5
- C语言学习(5)---指针
- C语言学习笔记5
- C++Primer学习笔记《5》
- C语言学习笔记5
- C学习
- C++学习
- c ++ 学习
- 学习C
- 单元测试初探
- 芯片IC附近为什么都放0.1uF的电容?这样做正确吗?有什么依据吗?
- C语言必背18个经典程序
- Android下拉刷新库,利用viewdraghelper实现,集成了下拉刷新,底部加载更多,数据初始加载显示loading等功能
- UGUI之精灵的创建与打包
- c++学习5
- iOS开发之详解正则表达式
- [BZOJ2428] [HAOI2006]均分数据 && 模拟退火
- first CUDA
- 小菜学Chromium之OpenGL学习之二
- 使用SharedPreference存储数据
- Python与Qt
- 出现error:unknown filesystem grub rescue解决办法
- 第26章 MYSQL Administrator