C和指针 (pointers on C)——第三章——数据

本文深入探讨C++中的作用域、链接属性及存储类型等核心概念,解析const、extern与static关键字的运用,并提供了实用建议避免常见错误。

第三章 数据

 

这章非常重要,尤其是作用域、链接属性、存储类型,const、extern和static关键字的使用。几乎就是所有公司C++面试里的第一题。

 

总结:

具有external链接属性(包括external、internal、None)的实体在其他语言的术语里称为全局实体(global),所有cpp里的函数都可以访问它。

只要声明的时候在函数体或代码块外部(包括main函数),默认的链接属性都是external。

如果声明的在代码块内部,说明它引用的是一个全局变量。

具有external链接属性的实体总是具有静态存储类型(auto,static)。静态存储类型的数据在程序开始前就会创建,并在程序整个执行过程中始终存在。局部变量相反,在函数运行时才能创建。

自动存储的原因:1、减少内存总占有量。2、在堆栈上分配可以有效地解决递归问题。

表 作用域、链接属性、存储类型总结

变量类型

声明位置

堆栈中?

作用域

声明Static?

声明external?

全局

代码块外

声明到文档结尾

限制在本文档内访问

默认为external

局部

代码块起始处

整个代码块

静态存储

变为静态存储

形参

函数头

整个函数

不允许存在

不允许

 

警告:

1、在声明指针变量时候采用容易误导的写法。

Int *a, *b, *c;//good

Int * a,b,c//只有a是指向int的指针

2、误解指针声明中初始化的含义。

Char*message = “hello world!“//其实赋值给了message,而不是*message

相当于:

Char *message;

Message =“hello world!”

3、不要依赖隐式声明,显式声明更清楚的表达程序的意图。

枚举类型最好显式得定义一个整型的值,默认第一个字符的整型值为0,后面的值比前面的符号名的值大1,以此类推

Enum week{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};//Monday=0

Enum week{Monday= 1, Tuesday = 2…};

4、在定义类型的新名字时,使用typedef而不是#define。

优势显而易见,当#define来创建新的类型名时,后者无法正确地处理指针类型。

#defined_ptr_to_char char *

d_ptr_to_chara, b;

就像int* a, b;一样,正确声明了a,但是b却被声明成了一个字符。

5、使用const声明可以避免变量发生变化。

Int const  *ptr; //声明一个指向整型常量的指针

Int *const  ptr;//声明一个指向整型的指针常量

Int const *const ptr; //声明一个指向整型常量的指针常量

6、使用名字常量而不是字面值常量

如:#define MAX_ELEMENT 50

       Intconst MAX_ELEMENT = 50;

前者是名字常量可以定义数组长度,而后者属于字面值常量,不能定义数组长度。

7、不要在嵌套的代码块之间使用相同的变量名。

8、除了实体的具体定义位置之外,在它的其他声明位置都使用extern关键字。

 

问题15

假定函数a声明了一个automatic的变量x,你可以在其他的function内访问x,只要你使用了下面这样的声明。

extern intx;

对还是错?如果x被声明为static,对还是错?

答:都错。变量只能在自己的作用域访问,不能在其他作用域访问,x的作用域就是他的a函数。Static只是改变了它的存储类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值