设为首页 加入收藏

TOP

C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》(三)
2015-07-20 17:33:02 来源: 作者: 【 】 浏览:19
Tags:系列 自学 课程 _8_ 指针 引用 Primer
?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 ? ? //int iArray_1[5] = {1,2,3,4,5};
16 ? ? //int iArray_2[3]= {1};
17 ? ? //int *pInt1[5] ={iArray_1, iArray_2};
18 ? ? //int (*pInt2)[5] = iArray_1; //error
19 ? ? //pInt2 = iArray_2; ? //error?
20?
21 ? ? int iArray_1[5]={1,2,3,4,5};
22 ? ? int iArray_2[3][5]={{1}};
23 ? ? int iArray_3[5][3]={{2}};
24 ? ? int (*pInt)[5] = iArray_2;
25 ? ? pInt=iArray_3; ?//error?
26?
27?
28 ? ? return 0;
29 }
复制代码
上面的代码中,我们可以知道 ?25行的语法是错误的,错误的原因是二维数组的第二维的指针长度不一致。通过上面的例子我们可以知道,* 和 [] 在一起定义指针变量
?
的时候,需要注意 * 和 [] 符号的优先级,同事需要知道加上括号后,定义的时候[] 的维度的扩展。这个地方是C语言当中经常会使用的,而且是属于较复杂的用法,因
?
此需要因此特别的重视。
?
?
?
6、 指针 和 const限定符/修饰符
?
  指针和const的结合使用没有太多的说头,主要是注意const修饰的 *p 还是 p, 只要分清楚修饰对象的不同就很好理解。
?
复制代码
int main()
{
? ? int iVar1 = 10;
? ? int iVar2 = 20;
? ? const int *pInt1 = &iVar1;
? ? int const *pInt2 = &iVar1;
? ? int * const pInt3 = &iVar1;
? ? const int * const pInt4 = &iVar1;
? ? int const * const pInt5 = &iVar2;
?
?
? ? return 0;
}
复制代码
  关于const限定符需要知道的就是上面的各个定义的意义,只要知道 const是修饰 *pInt 还是修饰pInt就可以准确的分辨各个定义的意义,具体可以关注我前面
?
给出的关于C语言趣事相关的链接文章。
?
  这里还有一个需要注意的地方,就是对于const对象如何定义指向其的指针,下面是一个例子:
?
复制代码
int main()
{
? ? const int iVar = 10;
? ? //int *pInt1 = &iVar; ?//error
?
? ? int const *pInt1 = &iVar;
? ? const int *pInt2 = &iVar;
?
? ? return 0;
}
复制代码
  这里要注意加了注释部分错误的原因。这里就不解释了,这个与const对象与引用的关系是一样的。
?
?
?
7、指针和typedef的使用
?
  在C语言中进程会做这样的预处理指令。
?
#define ?PINT ?int*
  这样定义宏以后,就可以通过这个宏来定义指针变量,如下所示:
?
#define PINT int*
?
int iVar = 0;
PINT pInt = &iVar;
  这样是可以通过的,但是这样会存在一个 漏洞,如果同时定义两个指针变量的话,就会出现错误。
?
#define ?PINT int*
?
int iVar1 = 0;
int iVar2 = 0;
PINT pInt1 = &iVar1, ?pInt2 = &iVar2;
? ? 很显然上面的代码存在漏洞, ?第二个变量 pInt2 不是指针变量,而是一个整型的变量, 好在这样的错误编译器在编译的时候会检查出来,这里需要引起注意。
?
? ? 我们可以利用typedef机制来规避上述的风险, ?typedef 的作用就是为数据类型取一个别名,尤其在数据类型比较长时是一个非常有效的机制, typedef的语法
?
如下:
?
  typedef ? 数据类型 ? 数据类型别名;
?
例如:
?
  typedef ?int* ?PINT;
  这就为 int* 这种类型定义了一个新的别名 PINT,在使用的时候PINT就表示 int*。
?
Exp:
?
typedef ?int* ?PINT;
?
int iVar1 = 0;
int iVar2 = 0;
PINT pInt1 = &iVar1, ?pInt2 = &iVar2;
  上面的代码定义了两个整型变量 iVar1、iVar2, 同时定义了两个指针变量pInt1 和 pInt2;?
?
要点:
?
  通过上面两个例子,就可以清楚 typedef和#define 之间的差别。
?
? ? ?注意typedef是语句,因此后面必须有个分号结尾。 ?这个点是经常容易忘记的,好在编译器一般可以检测出这样的错误。
?
  
?
  typedef和指针的结合还有一个值得注意的地方,就是 typedef 、const和指针同时出现。
?
typedef ?int* PINT
const PINT pInt; ?//error
  这里定义的指针对象pInt是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 ? ? typedef int* PINT;
16 ? ? const PINT pInt;
17?
18 ? ? return 0;
19 }
复制代码
程序编译的结果如下所示:
?
[root@localhost cpp_src]# g++ test.cpp?
test.cpp: In function ‘int main()’:
test.cpp:16: 错误:未初始化的常量 ‘pInt’
将程序改成下面的形式则正确:
?
复制代码
#include
#include
#include
#include
?
using std::cin;
using std::
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Leetcode:linked_list_cycle 下一篇HDU 1166 敌兵布阵 (线段树 &..

评论

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

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)