1、整形数据
在存储单元中的存储方式是:整数的补码。
系统执行到变量的定义语句时会为变量开辟存储空间。开辟的多少由数据类型决定。一个字节=8bit。
通常长整型(long int)数据的长度为4个字节,短整型(short int)的数据长度为2个字节,而int可以是2个字节或者4个字节,由编译系统决定。
2、字符类型 char
只能使用系统的字符集中的字符,大多数系统采用ASCII字符集,包括127个字符。
C语言中,用一个字节(8位)储存一个字符。
对于 char 和 int ,可以用 signed(可正可负) 和 unsigned(正整数) 去修饰
对于 unsigned 类型修饰的数据类型,有一下两类
- unsigned char :值的范围在0~255之间
- unsigned short :值的范围在0~65536之间
在keil编程中,已经做出了简化。 _t 表示 type
- uint8_t 代表 unsigned char
- uint16_t 代表 unsigned short
- uint32_t代表 unsigned int
3、浮点类型 float / double
C语言中,实数是以指数的形式存放在存储单元中的。由于小数点的位置可以移动,所以称为浮点数。
- float型 为单精度浮点数类型 , 4个字节存储空间
- double型 为双精度浮点数类型,8个字节存储空间
- long double型 为双精度浮点数类型,8个字节或16个字节的存储空间
4、指针变量
4.1 定义指针变量
- 指针变量的一般形式为:
__类型名 *指针变量名__
- 定义指针时必须指定变量的 基类型 ,即:为了有效的存取一个数据,除了需要知道数据的位置信息,还需要知道数据的类型信息。
如果指针指向一个整型变量,那么指针移动一个位置,意味着地址加4个字节。
4.2 指针指向数组
- 指针的乘除运算是没有意义的。但对数组使用指针时,指针自加或自减运算可以提高效率
p++ ; 使指针指向下一个元素
*p ; 得到下一个元素的值
++ 和 * 优先级相同,放在一起时自右向左执行。因此上式可以改写为:
*p++ ;
- C语言中,数组名(不包括形参的数组名)代表数组中首个元素的地址:
int a[10];
int *p = &a[0];
等效于
int a[10];
int *p = a;
-
当指针指向数组时,指针可以带下标。
如果 指针p 指向a[0],*p[i] 等效于 a[i];
如果 指针p 指向a[2],*p[i] 等效于 a[2+i]; -
当指针指向数组时,C编译都是将形参数组名作为指针变量来处理的。
fun (int arr[] , int n)
等效于
fun (int *arr , int n)
4.3 指针指向函数
- 在编译时,函数的源代码会被转换为可执行的代码并分配一段存储空间。这段空间的起始地址,就是函数的入口。调用函数时,从函数名可以得到函数的起始地址,并执行函数。
- 定义指针变量的一般形式为:
类型名 (* 指针变量名)(函数参数列表) - 定义p为指向函数的指针变量,它可以指向的函数的类型为整形,并且有两个整形的输入。
则:指针变量的类型为:int(* )(int ,int )
int max(int x, int y)
{
int z;
if(x>y) z = x;
else z = y;
return z;
}
int main()
{
int(*p)(int , int );
int a = 1, b = 3 , c;
p = max;
c = (*p)(a,b);
}
4.4 用指向函数的指针作为函数的参数
int max(int x, int y)
{
int z;
if(x>y) z = x;
else z = y;
return z;
}
int min(int x, int y)
{
int z;
if(x>y) z = y;
else z = x;
return z;
}
int add(int x, int y)
{
int z;
z = x + y;
return z;
}
int fun(inrt x,int y,int(*p)(int , int))
{
int result;
result = (*p)(x,y);
return result ;
}
int main()
{
int a = 21 , b = 13;
int m , n;
if(n == 1) m = fun(a,b,max);
else if(n == 2) m = fun(a,b,min);
else if(n == 3) m = fun(a,b,add);
return 0;
}