C、C++指针

2023-03-05  本文已影响0人  Kael_Zhang的安卓笔记

什么是指针?

获取对象的地址

double dv;
double *pd0 = &dv;
double *pd1 = pd0;
int *pi = pd0; // 错误示例:指针pi的类型和pd的类型不匹配
pi = &dv;  // 错误示例:试图把double型对象的地址赋给int型指针

指针值

指针的值(即地址)有4种状态:

这里很多同学可能不是特别理解,指针指向对象,为啥指向相邻空间的位置?这个可以参考数组去理解,数组可以当作指针理解,数组名就是指针名并指向第一个数据,那 数组名+1...+n,就指向数组第n个数据!

容易发现错误的情况就是拷贝或以其他方式访问无效指针,编译器不负责检查此类错误,访问无效指针的后果很严重!

通过指针如何访问对象

int iv = 8;
int *pi = &ivl;  //  pi 是指向变量 iv 的指针
cout << *pi ;  // *pi 得到指针pi指向的对象,输出 8

*pi = 80; // *pi 得到指针pi指向的对象,可由 *pi 为变量 iv 赋值
cout << *pi; // 输出 80
cout << iv; // 输出 80

什么是空指针

int *p1 = nullptr; // 创建空指针
int *p2 = 0; //错误:不能直接赋值!虽然不会提示语法错误,但是不能这么写!

赋值和指针

int iv1 = 1;
int iv2 = 2;
int *p = &iv1;
*p = iv2;  //改变的是 指针p 所指对象的值
p = &iv2; //指针p 被改变,指向 iv2 的地址

指针比较

可以用相等操作符(==)或者不相等操作符(!=)进行比较,比较结果是布尔类型的。如果两个指针存放的地址值相同,则其相等;反之,不相等

void* 指针

指针的转换

指向指针的指针

指针和const

const int dv = 2; // dv是常量,值不能改变
int *pd = &dv; // 错误:pd 是一个普通指针
const int *cpd = &dv; // 正确:cpd 可以指向一个常量

int dv2 = 3; 
cpd = &dv2 ; // 正确:但是不能通过cpd 改变 dv 的值 可以通过其他途径修改dval的值

int i = 0;
int *const ptr = &i;

指针和数组

数组名被解释为指向该数组的第一个元素的指针,但以下情况除外:
1.当作为sizeof运算符及typeid运算符的操作数时
2.当作为取地址符的操作数时 ("&数组名" 是指向数组整体的指针,而不是指向"指向第一个元素的指针"的指针。)
3.当使用decltype关键字时,返回的类型是数组而非指针。

指针允许递增递减

int ia[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *beg = begin(ia); // 指向ia的首元素的指针
int *last = end(ia); // 指向ia尾元素的下一位置的指针
上一篇 下一篇

猜你喜欢

热点阅读