指针 Who are 有?0.0
基本简述:
c++是一种与底层接触较多的语言,而底层无非是内存,每个内存都对应地址。而指针就是一种新的类型,只是他不像int 表示有符号整数,他只是表示的是一串十六进制的地址。在x86下,指针为了能够完全寻址。所以被定义为4个字节,而在x64下,为8个字节!
基本要素:
1、 需要操作的地址
2、 要操作的内存容量
引出语法:
数据类型 * 指针名;
例如: int * pstr ;
定义之困惑:
int* pstr=0, str=0;
int* pstr1 = 0, *str1 = 0;
对比两行:相信很多编程新手可能都不太一眼发现问题所在,但我们看一下第一行和第二行的差别,在于第二个变量是否有*号。究竟要说明什么呢?
代码如下:
cout << typeid(pstr).name() <<" “<< typeid(str).name() << endl;
cout << typeid(pstr1).name()<<” "<< typeid(str1).name() << endl;
结果:
-------------相信有心人已经发现差别了,虽然是小问题!但却十分得留意!!!-----------------
混淆概念?不存在:
Ⅰ: 数组指针与指针数组
1、指针数组: 本质是数组,举个例子:int型指针数组;它就跟int型数组,short型数组一 样,它是数组,但是每个成员是int*型。
2、数组指针: 本质是指针,他和int型指针,short型指针有什么区别呢?他指的东西大一点而已,他指向一个数组。
代码举例(一看就懂):
int a{ 1 }, b{ 2 }, c{ 3 }; //定义三个变量
int* pArr[3]{}; //定义指针数组
pArr[0] = &a; pArr[1] = &b; pArr[2] = &c;//每个成员都是指针而已
int aa[3] = { 1,2,3 }; //定义一个大小3的数组
int(*Arrp)[3]{};//定义数组指针
Arrp = &aa; //它指向一个大小为3的数组
Ⅱ 常量指针、指针常量与指向常量的常量指针
1、常量指针: 本质是指针!与变量指针(自己起的)对应,比如:int指针啦、short指针啦。它是什么呢?常量的指针,常量是什么?const int ,const short 而已;常量能改变?答案是不能,所以不能通过 *变量 = xxx 来改变常量的大小,它能干嘛呢?它可以指向别的常量甚至是变量
2、指针常量: 本质是常量!有int型常量,short型常量;它就是指针型的常量而已。比如:int型指针常量x为int * const x;它有什么特性呢?它指向一个数可以,但却不能改变指向了;但它却可以通过*号改变变量的值
**3、指向常量的常量指针:**满足以上两种特性就是这种
代码范例:
1、常量指针
代码:
const int str1 = 10; const int str2 = 20; int str3 = 30;
//定义常量指针
const int* cpstr1{ &str1 }; //*cpstr1 = 5; 都不能修改值
cout << "cpstr1 = " << *cpstr1 << endl;
cpstr1 = &str2; // *cpstr1 = 5; 都不能修改值
cout << "cpstr1 = " << *cpstr1 << endl;
cpstr1 = &str3; // *cpstr1 = 5; 都不能修改值
cout << "cpstr3 = " << *cpstr1 << endl;
结果:
总结: 常量指针可指向别的变量或者常量,但是不能通过*号来改变指向地址的值
2、指针常量
代码:
int str1{ 10 }, str2{ 20 };
int* const pcstr = &str1;
cout << "修改前 str1=" << *pcstr << endl;
//pcstr = &str2; 这句话不可能成功,因为指向了就不能改变了
*pcstr = 30;
cout << "修改后 str1=" << str1 << endl;
结果:
总结: 指针常量只能指向第一个数,之后不能改变指向;可通过*号来修改指向变量的值
3、指向常量的常量指针
代码:
const int str1{ 10 }; const int str2{ 20 };
const int* const cpcstr = &str1;
cout << "str1=" << *cpcstr << endl;
//*cpcstr = 30; //这句话不可能成功
//cpcstr = &str2;//这句话也不可能成功
结果:
总结: 指向后,不能改变指向,也不能通过*号修改指向地址的值,总之就是只读
感谢自己的努力拼搏!!老铁们,觉得说的还有点道理,记得点个赞哦!!!谢谢哦!