C/C++的一些基础问题(2)

1#if#endif

                       最霸气的注释

2NULL指向一个值为0的指针,他们都是整形其值也相同,所以可以交互使用在头文件stdio.h中定义

3、标准并未规定对数组下标的有效性检查 绝大多数编译器也没有进行检查 如果不手动添加检查多出来的数据就会存储在紧随数组之后的内存位置,,,这样就破坏咯原先存在这个位置的数据

4、编译环境和执行环境可以不再同一台机器上 独立环境(没有操作系统的环境例如在嵌入式系统中)

5. 没有放在堆栈中尚未初始化的变量在程序执行阶段装入内存中时得到初始值在独立环境中程序的载入必须手动安排也可以是吧可执行代码置入只读内存ROM

6.\?  输出"?"时防止被解释为三字母词(转义)

  \"    双引号

7. C中的4中基本类型

                   整形  浮点型   指针   聚合(数组结构体等)所有其他

8.注意长整形标准中并没有规定必须必须必短整型长只是规定不比短整型短

9.整形:

                字符  短整型 整形  长整形 都分为有符号与无符号

10.char 在缺省值得时候 

                  要么是signed 要么是unsigned取决于编译器。。。。所以不同的机器上char拥有不同范围的值所以只有当程序使用char型变量的值位于signed charunsigned char的交集中这个程序才是可移植的。。

                           Signed char-127~+127 unsigned char0~255

11.const 常量电脑如何辨别他是哪种类型呢?

                       取决于他如何让书写 eg在后面加L就当long int 如果直接写一个十进制数例如123 这可能是intlongunsigned 则他是最短类型但能完整容纳这个值

 

12.浮点类型 

                            eg  314159  6.02*10^23第一个数就不说咯能用整形表示 第二个数很明显超出咯计算机整形的表示范围  缺省是都是double

13. 

                           double至少和float一样长  long double至少和double一样长。。。所有浮点类型至少能容忍10^-37~10^37之间的任何值。。。

 

14.   指针常量几乎没用因为函数每次被调用他的局部变量可能分的内存位置不一样。

15.

                           int  *a,*b,*c int* a,b,c;          前者是三个指针后者不是。。。。所以正确的格式应该是 int  *a;  char  *a=”cbv”;

16 .                 eg typdef  char  *ptr_cahr; 就是把 ptr_char当成指向char的指针;而不是把*ptr_char当成 char类型;

 

17.为啥不用define来创建新的类型名呢, 举个例子吧 指针就不行  eg #define ptr_char   char * ;

                                Ptr_char a, b;    //a倒是整对了哟。。。b就整成一个字符咯。。。。

 

 

18. int const a; const  int a;是一回事咯。。。同时既然是常量也就无法赋值咯。。。。怎么让他一开始就拥有值呢? 两个选择  1:声名时就初始化;2:声名const的形参在函数调用的时候活的实参。 

 

19.作用域标示符的作用域就是程序中该标示符可以被使用的区域 标示符分属不同作用域可以取同样的名字

20.编译器可以确认4中不同类型的作用域 文件作用域函数作用域代码作用域原型作用域

21.位于一对花括号之间的语句成为代码块代码块开头声名的变量具有代码块域可以被给代码块的所有语句访问 当代码块处于嵌套状态时内层代码块的标示符在该代码块的尾部结束 如果内层有域外层同名的标示符则外层的标示符无法再内层中通过名字来访问

22.不嵌套的代码块由于两个代码块不可能同时存在所以编译器可以把它们存在同一内存。

23.形参域函数局部变量作用域相同。。。。。所以无法同名 同名咯后者隐藏前者 则无法通过函数传递参数。

24.任何在代码块之外的声名的标示符都具有文件作用域 表明从声名之处开始到源文件结束尾处都可以访问 特别注意在文件中定义的函数名也有文件域因为函数名不属于任何代码块

25.#include包含在其他文件中的声名不限于盖头文件的文件尾;;;;;;

 

 

26.链接属性 编译之后的连接 再执行  他决定咯相同标示符在几个不同源文件中是如何处理的。 3  external(外部 无论多少次几个源文件 都属于同一实体  internal(内部  同一源文件所有声名属于同一实体 不同源文件属于不同) none(无 他总是被当做单独的个体 也就是他的多个声名当做独立不同的实体 

27.

          凡是在代码块之外声名的变量总是放在静态内存中的,也就是静态变量  在代码块里面加 static也可以   register修饰的寄存器变量 编译器不一定理他 因为寄存器只有这么多 你弄咯了编译器就只有取前几个后面的当普通变量处理

28.静态变量默认出事值为0

 

29.总结  全局变量加上static则不允许其他源文件访问

             局部变量加上static这整个程序执行过程中一直保持

   

 

30 a=b=c+d  等同与 b=c+d a=b 因为赋值符号是从右网左算 看例子

. char ch;

…….

While((ch=getchar())!=EOF)….   

 这儿我们就要说一下getchar()  他的返回值是int 不是char    他是一个一个放到缓冲池中的 ASCⅡ存放   错了就返回-1   因为EOFwindows上是-1(主要原因是EOF所需要的提供的位数比char要多所以讲getchar的返回值存在char中就会导致被截断 然后将截断的值与EOF比较。。。所以在有些机器上可能这将是一个无限循环)

 

31.我们来看哈+=  

     a+=1;

     a=a+1;//这两个表达式是一样的。。但是看下面

   a[f(x)]+=1;

   a[f(x)]=a[f(x)]+1;//  这样的话就存在一个弊端了 第一 后者书写上繁琐咯  第二。编译器在处理后者是无法知道函数f是否具有副作用所以必须计算两次下表表达式的值。。。相比之下 第一种效率更高

 

 

32. 不能简单的通过检查一个值得位来判断他的类型必须通过观察程序中值的使用方式!!!!!!!!!

 

33.  我们来分析一个问题

     int    *a;

      ……..

     *a=12;

 

  声名创建咯一个变量名叫a的指针 后面那条赋值语句吧12存在a所指向的内存位置

      注意咯  a指向的哪里呢? 我们声名咯这个变量 蛋为对她初始化 所以我们不知道他存在什么地方的(可以等同于其他变量  如果是静态的 则初始化为0  如果是自动的  他根本不会被初始化)这样就乱用咯别人的地址  这个地址可能是非法的(这个还好) 万一合法咯 就老火咯、、、  因为这样的错误不好找!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

34.NULL指针 不指向任何东西  被赋予0值(这只是规定 具体机器上可能不一样 这就由编译器来翻译转换咯。。) 这是很有用的 例如在某个数组中查找每个特定的值的函数,可能返回一个指向该元素的指针  。没有就为空 有就为指向该元素的指针    

     但同时这样有事相当危险的违背软件工程的原理 用单一的值表示两个不同的意思将来不容易清楚他的真正的用意(所以上面例子还是返回两个独立的值比较好 一状态 一指针)

    同时 请千万注意对指针值引用的时候定要看是不是null

35.*说白咯就是一个间接访问符

36. 

   看一个指针的例子

        假定变量a存储与位置100;请看下面语句

      *100=25;

    它看上去像是把25赋给a因为位置100所存储的变量 但是错的 这条语句是非法的   因为字面值100是整形100不是指针类型呀   而间接访问操作符只能作用

于指针类型表达式。。。。上述例子改为 *int *100=25

    但是这个东西部实用  因为你根本不知道编译器把一个变量放在什么位置的,看起来就莫得用呀 也就是偶尔可以通过地址访问内存特定位置,注意不是变量而是硬件本身

 

37.我们来声名一个指向指针的指针

 

   int   a=12

   int   *b=&a;

   int   **c=&b;//因为*的结合性为从右到左  所以相当于 **c

38. 我们在来对左值右值做个更深的认识

    

     char ch =’a’;

     char *cp =&ch;

 

   现在有  *cp+1//注意*的优先级比+

   *cp+1)是左值 因为*cp+1)也就是这个值放在在a的位置上加一的地址里。。。

   *cp+1)也是右值  因为*cp+1)就是 cp+1这个位置中的值

  但是

   Cp+1 不是左值 因为晓不得 cp+1这个东西放在哪的  他只能为右值

 

39. 指针真牛逼  char * 加一是指向下一个字节 但是如果是float呢??它不是一个字节呀。。。

   这就是指针的牛逼之处咯 当一个指针域一个整数执行算术运算时整数在执行加法钱会根据类型的大小进行调整所以float *加一就相当于加咯float大小的字节

40.

   指针的运算

     指针+-整数(数组)

     指针-指针(两个指针都指向同一数组元素才允许)结果是以数组元素的长度为单位 以为其结果讲除以元素类型的长度  注意咯编译器不会检查两个指针是否位于同一数组。。。。所以程序员就要注意咯。。。

 

41.指针的关系运算(仅限于同一数组中)

  <  <=    >  >=

 

 

 

42.接下来我们讨论一下函数

      如果没有声名(也就是没有像编译器提供一些函数特定的信息)编译器会假定调用的参数是正确的 同时假定返回为整形  对于那些非整形的返回而言 隐式认定是致命的(好像我电脑上编译器不得行耶)

  最好的办法还是用#inclued

 

 

 

43.数组  只有两种情况下数组名不当做指针常量来表示  就是当作为sizeof或单目操作符&

 

44.再说一下函数指针 函数也是有地址的编译后的函数其实是一组指令的集合 这样一组指令在程序运行时 存在于内存中的 其起始地址就是该函数的地址也叫入口地址  编写函数是可以直接用函数名来表示地址也可以用&+函数名来表示地址

45.函数指针的定义  eg

                          Int   (*pf)  (int   a,   int  b)   //注意  *与函数名一定要加括号 否则就成咯返回类型为int *咯

 

 

                                                                                                                                  shmily_h

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值