设为首页 加入收藏

TOP

C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》(一)
2015-07-20 17:33:02 来源: 作者: 【 】 浏览:10
Tags:系列 自学 课程 _8_ 指针 引用 Primer
 C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容。指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法。C++继承这一高效的机制,同时引入了另一个与指针相似但不相同的机制: 引用。
?
?
?
一、引用
?
  简单的来说,引用就是变量的别名(alias), 通过别名我们可以操作引用代表的变量。 定义一个引用的语法如下所示:
?
    变量类型 ? &引用标识符 = 变量名。
?
Exp:
?
复制代码
  int ?iVar=10;
?
  int ?&iRef = iVar;
?
  iRef = 20 ;
?
  cout<
复制代码
  这段程序执行的结果就是输出: 20 ;
?
  程序通过引用 iRef 改变了变量iVar的值。
?
要点:
?
  1、在定义引用的同事必须初始化,指出引用代表的是哪一个变量,而且这种“指向关系”不能改变。
?
  2、引用只是对象的另一个名字,可以通过对象的原标识符访问对象,也可以通过对象的引用访问对象。
?
  3、在一个语句定义多个引用的时候,每个引用标识符(引用名)的前面必须都加上&符号,否则就是错误。
?
?
?
1、const引用
?
  const引用是指向const对象的引用, 不能通过const引用改变原对象的值。如下所示:
?
?
?
复制代码
?1 #include
?2 #include
?3 #include
?4 #include
?5?
?6 using std::cin;
?7 using std::cout;
?8 using std::endl;
?9 using std::string;
10 using std::vector;
11 using std::bitset;
12?
13 int main()
14 {
15 ? ? const int iVar=10;
16 ? ? const int &iRef = iVar;
17 ? ? iRef = 20;?
18 ? ? cout<
19?
20 ? ? return 0;
21 }
复制代码
?
?
上面的程序编译的结果如下所示:
?
[root@localhost cpp_src]# g++ test.cpp?
test.cpp: In function ‘int main()’:
test.cpp:17: 错误:assignment of read-only reference ‘iRef’
可以发现在第17行,试图对一个指向const对象的const引用赋值,结果编译报错。
?
复制代码
?1 #include
?2 #include
?3 #include
?4 #include
?5?
?6 using std::cin;
?7 using std::cout;
?8 using std::endl;
?9 using std::string;
10 using std::vector;
11 using std::bitset;
12?
13 int main()
14 {
15 ? ? const int iVar=10;
16 ? ? const int &iRef = iVar;
17 ? ? iRef = 20;
18?
19 ? ? int &iRef1 = iVar;
20 ? ? cout<
21?
22 ? ? return 0;
23 }
复制代码
程序编译结果如下:
?
[root@localhost cpp_src]# g++ test.cpp?
test.cpp: In function ‘int main()’:
test.cpp:17: 错误:assignment of read-only reference ‘iRef’
test.cpp:19: 错误:将类型为 ‘int&’ 的引用初始化为类型为 ‘const int’ 的表达式无效
我们发现在程序编译的时候第19行也报错啦,报错的类型是: 将 类型int &的引用初始化类型const int的表达式无效。
?
2、字面值引用
?
  ?可以定义const引用代表字面值。实例如下:
?
复制代码
int main()
{
? ? int const &iRef = 100;
? ? const string &strRef = "volcanol";
? ? cout << iRef <
? ? cout << strRef <
?
? ? return 0;
}
复制代码
程序的执行结果如下:
?
[root@localhost cpp_src]# g++ test.cpp?
[root@localhost cpp_src]# ./a.out?
100
volcanol
上面的实例注意一点: 要对字面值定义别名引用,则必须将别名引用定义为const型的,否则将出现编译错误。
?
?
?
二、指针
?
  指针是什么,有的地方说是指针是一个地址。这里我们不对指针的复杂用法进行讨论,如果想了解指针的复杂用法可以产考我在园子里的另外一篇随笔,链接地址
?
为:http://www.cnblogs.com/volcanol/archive/2011/06/05/2073042.html
?
1、指针的定义
?
  在C++中定义指针,很简单,在定义的变量的时候,在变量的前面加上一个 * 就表示要定义一个指针变量。语法如下:
?
指针要指向的数据类型 ?* 指针变量名;
Exp:
?
  int ?*pInt; ?定义了一个指向整型变量的指针变量pInt;
?
  string *pStr; ?定义了一个指向string类型的对象的指针pStr;
?
  vector ?*pVectorInt; 定义一个指向vector 容器的指针。?
?
  bitset<5> ? ? *pBitset5; ?定义一个指向bitset<5>类型的对象的指针。
?
2、指针变量赋值和初始化
?
  指针变量在使用前必须有一个确定的指向,否则就会造成一个游离的指针,操作的游离指针会得到一个意想不到的的结果。通过取得一个变量的地址然后赋值给
?
指针变量或者初始化指针变量使指针变量有一个确定的指向。 ?通过操作符 & 取得一个变量/对象的地址或者(指针)。
?
  指针变量初始化:
?
      int ?iVar = 10;
      int ?*pInt = &iVar;
?
?
  指针变量赋值:
?
      int iVar = 10;
      int *pInt1;
      int *pInt2;
      pInt1 = &iVar;
      pInt2 = pInt1;
?
?
3、指针的引用
?
  通过解引用操作符 * 可以引用指针指向的变量。
?
复制代码
  int iVar = 20;
?
  int *pInt = NULL;
?
  pInt = &iVar;
?
  cout<< * pInt<
复制代码
Exp:
?
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Leetcode:linked_list_cycle 下一篇HDU 1166 敌兵布阵 (线段树 &..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·JAVA现在的就业环境 (2025-12-26 01:19:24)
·最好的java反编译工 (2025-12-26 01:19:21)
·预测一下2025年Java (2025-12-26 01:19:19)
·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)