欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

C++ 学习 指针

发布时间:2023/12/20 c/c++ 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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++ 学习 指针的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。