C++ 学习 指针
指针
文章目录
- 指针
- 指针的定义
- 指针的初始化
- 指针的操作
- 解引用操作:
- 指针访问数组元素
- 指针和const
- 指向const 对象的指针
- const指针
指针的定义
指针定义方式有如下两种:
<type> *p //如 int *P,推荐使用此种定义方式,不易产生误解 <type>* P //如 int* P ,不推荐此种方式,易产生误解int* P0,p1;//只有P0是int型指针,p1不是指针指针的初始化
指针的初始化有四(5)种方式
double dval;double *p = &dval//类型匹配的对象的地址 double *p1 = P //同类型对象的指针 double *p2 = P+3//另一对象之后的地址 double *p3=0 or const int zero =0;double *p3 = zero //字面常量0或者const int 型值为0的常量 double *p4 =NULL //需要包含catdlib头文件一种特殊指针Void* 可指向任意类型数据(const 修饰除外)
备注在定义指针时,尽量完成对指针的赋值,如果当前指针所指对象还没有定义,则将其赋值为0。因为C++不检测指针的赋值,未赋值的指针会被随意分配内存,导致程序崩溃。
指针的操作
解引用操作:
"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。 也就是说,解引用是返回内存地址中保存的值。
string s("hello") string *p =&s count <<*P //输出“hello”备注:没有采用解引用操作时就是对指针的操作,与指针所引用的变量无关
string s1("world") p = &s1 cout << *p //输出“world” cout << s //输出“hello” *p =s;cout << s1;//输出“hello” #include <iostream> using namespace std; int main() {cout << "Hello, world!" << endl;string s("hello");string *p = &s;cout << *p << endl;string s1("world");p = &s1;cout << *p << endl;cout << s <<endl ;*p = s;cout << s1 <<endl;} //运行结果 Hello, world! hello world hello hello指针访问数组元素
在表达式中使用数组名字时,该名字会自动转化为指向数组的第一个元素的指针。
int ia[]={0,2,4,6,8} int *Arr = ia;//*Arr = ia[0] 指针的算术操作 int *Arr2 = Arr+2 //*Arr2 = ia[2] int Varb = *(Arr+2) // Varb = ia[2] ptrdiff_t n = Arr2-Arr // n = 2 ptrdiff_t是一种标准库类型的数据 指针的下标 int k = Arr2[-2]//k = ia[0],下标不可超出数组首,超出数组末端(最后一个元素的下一个地址)的指针下标,成为哨兵,可参与比较不可解引用 #include <iostream> using namespace std; int main() { int ia[]={0,2,4,6,8}; int *Arr = ia; cout << *Arr <<endl; int *Arr2 = Arr+2; cout << *Arr2 <<endl; int Varb = *(Arr+2); cout << Varb <<endl; ptrdiff_t n = Arr2-Arr; cout << n <<endl; int k = Arr2[-2]; cout << k <<endl; //超出数组末端成为哨兵的指针作用 for (int *pbegin = ia,*pend = ia+5;pbegin != pend;++pbegin)cout << *pbegin << ' '; }运行结果 0 4 4 2 0 0 2 4 6 8指针和const
Const修饰符可前可后,为防止混乱,一律放在前面修饰比较好
指向const 对象的指针
C++要求指向Const对象的指针也具有const特性,什么叫Const特性?const的特点就是值不可修改,那么具有const 特性的指针就是不能通过其解引用修改值,此即const特性。
具有cont 特性的指针可以指向const 常量也可指向普通变量,但是都不可通过解引用修改值。
const double *cptr; //定义const特性的指针 const double pi = 3.14;//const 常量必须赋初值 *cptr = &pi //cptr指针指向pi常量 double pi2 = 3.14159 *cptr = pi2//错误,不可通过解引用改变值cptr = &pi2//可以,指向一个非常量const指针
const 指针和指向const对象的指针肯定是不同的。const 指针本身的值不可修改。
/指向常量的指针 int errNumb = 0; int *const p = &errNumb;//此处的*const 因该放在 int 后 errNumb = 1; //可直接修改errNumb的值 *P = 2 ; //可修改解引用的值 p = &errNumb +1 //错误,不可修改指针本身的值/指向const 常量的 *const,不可做任何修改 const int a =1; int *const pa = a ;一种间接的const 类型指针定义 typedef string *pstring; const pstring cstr;//cstr是一个const 指针 #include <iostream> using namespace std; int main() { int k = 1 ; int *const p = &k ; k = 2 ; cout << *p <<endl; *p = 3 ; cout << k <<endl; }运行结果 2 3#include
using namespace std;
int main()
{
int k = 1 ;
int *const p = &k ;
k = 2 ;
cout << *p <<endl;
*p = 3 ;
cout << k <<endl;
}
运行结果
2
3
总结
- 上一篇: 入门无人驾驶学习路线
- 下一篇: C++语法细节注意集锦