标签:最好 写法 频繁 ++ 等价 col 受限 崩溃 测试
int ival = 1024; int &refVal = ival; // int &refVal2 ; // 报错:引用必须被初始化 int &refVal1 = ival, &refVal2 = ival, &refVal3 = refVal1, Val4=ival; // refVal1/refVal2/refVal3都是引用,其中refVal3用另一个引用进行初始化 // Val4是一个int它并不是引用
不管是否学过C或者C++对于指针这个东西只要是接触过计算机语言的,我相信都会对这个东西有所耳闻。
强大、底层、无限制、容易出错、容易崩溃、难以使用
让C/C++程序员又爱又恨的东西。
我认为,指针确实存在他的弊端,但是反过来想一下,如果你有足够的能力掌握它,那么它只会帮助你。
就像手枪,警察拿着它维护治安,军人拿着它保家卫国,匪徒则拿着它打家劫舍。
区中的区别不是手枪本人,而是持有它的人,或者准确的说是持有者的想法和做法。
指针同样有这个特性,在粗细大意的程序员手中,永远是噩梦.......
我想这类问题不是我一个人遇到过,有些项目经验,特别是进入过问题攻关团队的人一定深有体会。
下面来介绍一下指针最基础的知识,请注意领会。
int *ip1, *ip2; // ip1和ip2都是指向int性对象的指针 double dp, *dp2; // dp2是指向double型对象的指针,dp是double型对象 // 如何对一个指针类型进行初始化 int ival = 42; int *p = &ival; // p存放变量ival的地址,或者说p是指向变量ival的指针 double dval; double *pd = &dval; // 初始化是double型对象的地址 double *pd2 = pd; // 初始值是指向double对象的指针 int *pi = pd; // 错误 类型不匹配 pi = &dval; // 错误,依然是类型不匹配的原因
int ival = 42;
int *p = &ival; // p存放着变量ival的地址,或者说p是指向变量ival的指针
std::cout << *p; //由符号*得到指针p所指向的对象,输出42
*p = 0; // 由符号*得到指针p所指向的对象,即可精油p为变量ival赋值
std::cout << *p; // 输出0
int *p1 = nullptr; // 等价于 int *p1 = 0; 将指针赋值为空,代表一个空指针
// nullptr 是C++11中新引入的,如果没有对C++11支持请按照如下写法
int *p3 = NULL;
指针的四种状态:
1. 指向一个对象
2. 指向紧邻对象所占空间的下一个位置
3. 空指针, 没有指向任何对象
4. 无效指针, 上述情况以外的其他情况
第四种情况是引发程序崩溃的唯一指针相关原因,编译器没有办法检查这种错误,所以必须靠程序员自己完成验证。
而第二和第三种情况,虽然有效,但是行为是受限的,所以不要试图访问这些指针。
我的建议,对于初学者来说需要详细掌握指针的每种特性细节,
接下来介绍两个比较绕口的类型
int ival = 1024; int *pi = &ival; // pi指向一个int型的数 int **ppi = π // ppi指向一个int型的指针
int i = 42; int *p; // p是一个int型的指针 int *&r = p; // r是一个对指针p的引用 r = &i; // r引用了一个指针,因此给r赋值&i就是令p指向i *r = 0; // 解引用r得到i,也就是p指向的对象,将i的值改为0
与指针或引用相关的表达式的阅读顺序一般是从右向左的。
【共读Primer】10.<2.3> 复合类型 Page45
标签:最好 写法 频繁 ++ 等价 col 受限 崩溃 测试
原文地址:https://www.cnblogs.com/ChattyKu/p/9412961.html