C专家编程-读书笔记之第三章

要点1,关于标识符在声明、被强制转换时和被调用时的方法的联系和不统一性:

比如

 int *p=1;和int *p;p=1;

比如

char (*j)[20];

j=(chair(*)[20])malloc(20);

比如在声明中()通常代表函数的出现。


要点2,关于类型声明符和类型限定符的作用对象:

文中举例:const int * const p;不得不说此处有关于指针的知识;

而更极端的例子是:volatile char *const int*const p;//实际上我未进行验证,意义应该为p指针本身为const的 ,指向的内容为const int的,而该内容指向的内容为volatile char的。


要点3,关于声明中的优先级的分析:

文中举例的复杂程度较高的声明实际上都和“函数指针”的声明相关,所以有关于函数指针的基础扎实的话应该不会有问题。

关于它的“图标分析”声明优先级我概括如下:声明时首先找到最左边的标识符然后看下此标识符的右边有没有“[]”或者“()”,因为这两者的优先级除了括号以外最高,如果标识符有被什么括号包括的话那么就就把这个括号当成整体,而关于const 、int、 *、volatile 等为修改哪个应该通过以上要点已经清楚了。

总得来说就是函数指针,指针数组,数组指针的套路了,如(*next)(int)为函数指针的声明.


要点4,关于声明的另一种思考:

C语言,或者是程序都是目的性非常强的东西。而关于声明那么必须是围绕着标识符进行的。

规律一,关于函数的声明如 int free(void); 像这样的一个声明 也许可以这样看,调用free()函数得到输出值,然后将其输出值强制转换为 int 类型。所以标识符的左边的类型声明符即是它的输出类型,比如int i;又或者j=(unsigned char)i;
规律二,在声明时如果出现(void)或者(int)这种形式则表示函数的输入类型,而左括号的左边则代表指向函数的地址的变量。
规律三:所声明的东西在被调用时通常都是将类型声明符略去之后的“整体”出现的(如函数声明),而相对的不通常的情况下就是指针以除了“*”单独出现以被赋予地址值(如函数指针)。从概率上来说声明的是指针(或者数组)或者非指针是一半一半。而整形变量能不能当成指针用,为什么把指针和整形变量区别定义,原因很简单这样会导致混乱,可能会让程序员少码一行代码但是可能会导致条理混乱,况且*还有乘的意思。

要点5,typedef的用途:
typedef可以让声明在形式上变得更简洁,这样的好处是程序变短了,而且以后需要改定义的时候(如unisgned short在不同平台上的长度不一而需要修改)只需要修改一处即可,这一点和DEFINE的道理是一样的,只不过typedef在“声明领域”更专业而DEFINE则在“只读变量领域”更专业。
typedef的另一层意义是在声明过程中将标识符复用,因为在声明过程中标识符的意义表示得很纯粹。这也是为什么以下行得通的原因。
typedef int (*ptr_to_int_fun)(void); 
(ptr_to_int_fun) p; 
这是在声明代码段中一种充分利用资源的复用。

要点6,typedef和#define的区别:
#define int_ptr int *;
int_ptr a,b;
本意是a和b都是int型指针,但是实际上变成 

int* a,b;
a是int型指针,而b是int型变量。这时应该使用typedef定义: 

typedef int* int_ptr;
int_ptr a,b;
这样a和b就都是int型指针了。

typedef int bana ; unsigned bana i;这样的用法是非法的。

要点7,union:
union的使用以节省储存空间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值