C 与指针摘记

本篇文章是读《C与指针》一书的笔记,

原创博客,转载请说明来源:http://blog.csdn.net/lizhihaoweiwei/article/details/14389935

1.说明符的定义:包含一些关键字,用于描述被声明的标识符的基本类型。说明符也可以用于改变标识符的缺省存储类型和作用域。如:short , long ,singed, unsinged。声明一个int类型的变量时,如果已经出现了另一个说明符,则int可以省略:unsinged short int p ;与 unsinged short p; 是等价的。


2.浮点类型的说明符除了 long double,其它几个说明符(short , singed,unsinged)都是不可用的。


3.int *不是类型,没有这个类型。声明 int* a,b,c;可能不是你想要的,应该是 int *a,*b,*c;


4.函数不显示地指明返回类型时默认地为  int .这里可以扩展一下,C语言里的 main 函数其实在任意情况下都应返回int.这是由ANSI C 和 POSIX.1 定义的。任何函数都应该是有一个状态的,起始状态和终止状态,这个是函数与过程的区别!过程可以要示终止时不报告状态。若 main 函数没有 return 语句或者执行了一个没有返回值的return语句,则进程的终止状态是未定义的。


5.typedef 和 define :
typedef char *tpch; //使用 typedef 定义了一个新类型,tpch 是一个字符指针类型
#define pch char*;//ppch 在预处理时期被展开为 char*
这两者可能相同,可能不同。要注意以下的使用情况:
tpch a , b;//等价于 char *a,*b;
ppch a , b;//等价于 char *a,b;
这两个声明明显不一样。
const tpch a ;//声明一个指向字符的const 指针,等价于 char * const a
const ppch a;//即 const char * a,声明了一个指向const 字符的指针。
补充一下:
char * const a 读作:a 是一个const指针,指向char。
char const *a 读作:a 是一个指针,指向 const char。这种声明等价于 const char *a;


6.C语言编译器有四种类型的作用域:文件,函数作用域,块,原型作用域。
文件作用域:所有在代码块之外声明的标识符皆有文件作用域。这此标志符从声明处到文件结束都可以被访问。头文件特殊在,它里面声明的标志符可以被任何包含它的文件于包含处往后访问。
原型作用域:一个函数的形参,也就是声明一个函数时,它的括号 如,foo(...),“...” 即是原型的作用域。它冲突仅仅发生在对于同一个函数给它声明了两个一样名字的形参。
7.C语言链接属性:external , internal , none ;
当一个程序中的源文件被编译成多个目标文件,以及某些程序库(中的函数,过程,某些资源),它们被链接程序以一定的组织方式链接为一个整体,形成可执行的程序。如果一个标志符出现在不同的目标文件中,那么将有三种可能的链接方式;
external : 使用用external 标志的声明,它们都指某一个目标文件中的实体。
internal  : 属于这个链接属性的声明,一般用 static 修饰,在同一相目标文件中所有的声明都指代这个目标文件中的实体。
none      : 每个声明都链接一个特异的实体,即多个这个的声明每个都被链接到一个可链接的实体。
这里,有必要补充一下,一个正在运行的C程序在内存中的空间布局以及 static ,const , external 各自的存储及应用需要注意的地方。
这里可以参见我的另一篇文章:const static extern 存储与进程空间布局

8.自动化变量无初始化值。目标文件链接时,无法判断自动变量的存储地址,自动变量的地址不是一个定值,函数的每次调用中可能占据的地址都不一样。我们来考虑一样,也许编译器可以这样实现,对于每个自动变量或数组,在决定它的存储地址时一并给它一一初始值,就像对于静态变量的处理那样。的确,这样是可行的!但实质上,编译器是不会这样实现的,其一是某一个函数可能会被调用多次,而每次调用时栈地址不确定,所以每次都要初始化自动变量,且需要初始化的自动变量的数目不确定,可能是一个很大的数组,而自动变量初始化发生在程序的运行时期,C语言不会做如下假设:你能够容忍运行时期的未知的初始化自动变量所耗费的未知时间!C语言的设计是一个精简的图灵完备模型,设计的原则遵循KISS原则,它不会牺牲效率以换得可能不需要的功能;其二是,“编译器给自动变量赋初始值”,这个行为不必要,编译器并不知道赋什么初值对程序员是最好的,而且,程序员如果确切知道需要使用某一个初值,他应该显式地给出!C语言要求你知道自己在做什么,它尽量减少对你的假设,它不是一个容错超高的系统,而是,事先声明了一系列你应该注意的问题,然后,它只作了一个假设:你清楚地知道自己在做什么!最后,它保证以高效率运行!综上,自动变量没有缺省的初始值。


9.由于自动变量并没有缺省初始化的过程,也即编译器并不会在分配内存时一并给了值,那么,我们可以推测,自动化变量初始化比静态变量的初始化需要更多的开销,显式的自动变量初始化(即在声明一个自动变量时给它赋一个值)所花的时间等于一个声明外加插入了一个赋值。





(...持续更新)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值