原创 【学习笔记】C++之一 基本数据类型与语句

2011-8-1 19:33 1841 7 7 分类: 软件与OS

第1章

1.1        基本概念

一元强制类型转换说明符:static_cast<type>变量。

五个作用域范围函数范围、文件范围、块范围、函数原型范围、类范围。

递归与迭代:迭代显式使用重复结构;递归通过重复函数调用实现重复。

1.   内联函数

  典型情况下,除了最小函数以外,编译器可以忽略用于其它函数的inline限定符。也就是说,不是加了inline关键字,内联效果就一定有用。尽量将函数放在头文件或调用语句之前。

2.   参数传递

  使用指针传递可修改的参数给函数,不可修改的小参数按值调用传递,不可修改的大参数用常量引用传递给函数。

3.   默认参数

  当函数调用中省略默认参数时,默认参数值自动传递给被调用的函数。默认参数必须是函数参数列表最右边的参数。默认值只能在函数原型中定义。在函数调用时,如果没有给定参数,则编译器将会传递默认的参数。

4.一元作用域运算符“:”

可以在同名局部变量的作用域中访问全局变量。

5.函数重载

  编译器通过检查调用中的参数个数、类型和顺序来选择相应的函数。无法通过返回值来检查,如返回整型的值时,该值可能被赋给浮点数,这时浮点数类型与整型就不一致了。

  重载通过签名来区别,签名即函数名和参数类型的组合,以实现类型安全链接[U1] 。

6.   函数模板

  用于解决不同数据类型下的相同类似操作时需重复编码问题。使用函数模板,可针对特定的数据类型,生成相应的函数代码。如下,相应的数据类型为T,Y。

Template <class T, class Y>

T max (T x, Y y)

{

函数定义

}

使用方法:z = max(x,y)     // 根据调用全自动生成相应的函数代码及调用代码

7.   关于指针

  指针非常灵活,但是可能由于指针的值指向了非法地址,程序运行时可能会导致程序跑飞、系统死机等问题。这些情况在单片机程序中非常常见,而在PC机上,由于处理器、操作系统有此类的异常处理机制,所以多数仅仅是以程序退出为结果。

  • 指针数组:类型 * 指针数组名[NR]:数组名先与[]结合,构成数组;
  • 指向数组的指针:类型 (*指针名)[4]:由于括号,*先与名称结构,构成指针;
  • 指针函数的指针:类型 (*指针名)(参数列表):先构成指针
  • 返回值为指针的函数:类型 * 函数名(参数列表):由于括号,先构成函数;返回值为指针;

8.   常量限定符const

将指针传递给函数有4种方法:

  • 非常量数据的非常量指针:类型 * 指针名,指向的数据以及指针变量值均可更改;
  • 常量数据的非常量指针:const 类型 * 指针名,const类型指明相应的数据不可更改,而指针可更改;
  • 非常量数据的常量指针:类型 * const 指针名,指针不可更改,而数据可更改;
  • 常量数据的常量指针:const 类型 * const 指针名,指针与数据均不可更改。

9.   浮点类型

  由于计算机类型的限制,使用浮点数进行运算时,需要使用相应的库进行转换,而使用整型则无此限制。因为在针对MCU编程中,尽量使用整型运算,可减少ROM占用量。

1.2        数据类型

1.2.1    整型常量后缀(u/l)

  整形常量加u/U,表示unsigned int型。如无符号数12345u,按unsigned int方式存储;而-12345u,则先转换为补码53191,再按无符号数存储。如果整常量后加l/L,则认为是long型。

1.2.2    多维数组与指针

定义: int a[2][3];有:

  •   a – 二维数组名,即第0行首地址;
  • a[0]、*(a+0)、*a --- 第0行第0列元素地址;
  • a + 1, &a[1] --- 第一行首地址;
  • a[1]、*(a+1) – 第1行第0列元素首地址;
  • a[1] + 2、*(a+1)+2、&a[1][2] – 第一行、第2列元素地址
  • *(a[1] + 2)、*(*(a+1) +2)、a[1][2] – 第一行第2列元素的值。

指向数组元素的指针变量:int * p;

指向由M个元素组成的一维数组的指针变量:int (*p)[4]; []的优先级比*高,所以加上括号;否则将变成指针数组( int * p[4])

指向函数的指针:int (*p)(形参列表);

返回指针值的函数:int * p(形参列表);

1.3        结构体

  得到一个field在结构体(struct)中的偏移量

      #define FPOS( type, field )  ( (dword) &(( type *) 0)->field )

  得到一个结构体中field所占用的字节数

      #define FSIZ( type, field ) sizeof( ((type *)0)->field )


文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条