最基本单位 转换关系
1Byte = 8 Bit
1 KB = 1,024 Bytes
1 MB = 1,024 KB
1 GB = 1,024 MB
1 TB = 1,024 GB
1 PB = 1,024 TB
1 EB = 1,024 PB
1 ZB = 1,024 EB
1 YB = 1,024 ZB
PS:B即Byte,音译拜特,字节的意思,一般以字节作为计算机存储容量基本单位。1个字节是8个二进制位(8个二进制位组成1个字节),即1Byte=8bit(八个位的组合,共有256种电路状态)。1个数字=1个英文字母(字符)=1字节(Byte),即一个标准英文字母就是一个字节,它有8个比特(bit),(如A为10D,用00001010来表示,8个二进制位)。1个汉字=2个字节,即一个标准汉字有2个字节,8个bit一个字节,也就是说在计算机里1个汉字要用16个bit来表示。另外中文标点符号占2个字节,英文标点符号(,.?!%&+-*/),占1个字节,中文省略号(……)和括(破折)号(——)各占4个字节。
C语言中基本类型:
32位编译器
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
指针变量运算总结:
对指针变量的引用包含两个方面:一是对指针变量本身的引用,如对指针变量进行的各种运算;二是利用指针来访问所指向变量,对指针的间接引用。
1.指针的赋值运算
(1)将变量地址值赋给指针变量,使指针指向该变量。
设有如下定义:
int a,b,*pa,*pb;
float *pf;
第一行定义了整型变量a,b及指针变量pa,pb。pa、pb还没有被赋值,因此pa、pb没有指向任何变量,如图6.3(a)。下面的语句:
a=12;b=18;
pa=&a;
pb=&b;
第一行对a、b变量赋值,第二、三行分别将变量a、b的地址分别赋给指针变量pa、pb,使pa、pb分别指向了变量a与b。这样,变量a也可以表示为*pa,变量b亦可以表示为*pb。如图6.3(b)所示。
(a) (b) (c)
图6.3指针地址赋值示意图
(2)相同类型的指针变量间的赋值
pa与pb都是整型指针变量,它们间可以相互赋值,如:pb=pa;是合法的,此时pa,pb都指向变量a,a、*pa、*pb是等价的。如图6.3(c)所示。
注意:只有相同类型的指针变量才能相互赋值,如pf=pa;是不允许的。因为pa是整型指针,pf是浮点型指针。
(3)给指针变量赋“空”值
当指针变量刚定义时,它的值是不确定的,因而指向一个不确定的单元,若这时引用指针变量,可能产生不可预料的后果,破坏程序或数据。为了避免这些问题的产生,除了上面介绍的给指针变量赋以确定的地址值之外,亦可以给指针变量赋“空”值,说明该指针不指向任何变量。
“空”指针值用NULL表示,NULL是在头文件stdio.h中预定义的常量,其值为0,在使用时应加上预定义行,如:
#include "stdio.h"
pa=NULL;
亦可以用下面的语句给指针赋“空值”
pa=0;
或
pa='\0';
这里指针pa并非指向0地址单元,而是具有一个确定的“空值”,表示pa不指向任何变量。
注意:指针虽然可以赋值0,但却不能把其他的常量地址赋给指针。例如,即使你知道整型变量a的地址是4000,也不能使用下面的赋值语句:
pa=4000;而只能:pa=&a;
对全局指针变量与局部静态指针变量而言,在定义时若未被初始化,则编译系统自动初始化为空指针0。局部指针变量不会被自动初始化,因而指向不明确。
例6.1从键盘上输入两个整数到a、b,按由大到小输出。
#include <stdio.h>
void main( )
{
int a,b,*pa=&a,*pb=&b,*p; /*定义pa、pb,并初始化,如图6.4(a)所示*/
scanf("%d%d",&a,&b);
if(*pa<*pb)
{
p=pa; /*进行指针交换,如图6.4(b),(c)所示*/
pa=pb;
pb=p;
}
printf("\n a=%d,b=%d\n",a,b);
printf("\n max=%d,min=%d",*pa,*pb); /*pa指向大数,pb指向小数*/
}
若输入:12 22↙
输出结果:a=12,b=22
max=22,min=12
例中一开始指针变量pa与pb被初始化,分别指向变量a与b,输出时约定pa指向大数,pb指向小数。比较a、b的大小,a小时则交换指针pa、pb,使pa指向大数b,pb指向小数a,从而达到题中要求。指针变化情况如图6.4所示。
(a) (b) (c)
图6.4指针的变化情况示意图
2.指针的算术运算
一个指针可以加、减一个整数n,但其结果不是指针值直接加或减n,而是与指针所指对象的数据类型有关。指针变量的值(地址)应增加或减少“n×sizeof(指针类型)”。
例如,有下列定义:
int *p,a=2,b=4,c=6;
假设a,b,c三个变量被分配在一个连续的内存区,a的起始地址为4000;如图6.5(a)所示。
(a) (b) (c)
图6.5 指针移动示意图
语句p=&a;表示p指向a变量,即p的内容是4000;如图6.5(b)。
语句p=p+2;表示指针向下移两个整型变量的位置,p的值为4000+2×sizeof(int)=4000+2×2=4004,而不是4002,因为整型变量占两个字节,如图6.5(c)所示。
我们可以直观的理解为:
p=p+n表示p向高地址方向移动n个存储单元块(一个单元块是指指针所指变量所占存储空间)。
p=p-n表示p向低地址方向移动n个存储单元块。
p++,++p,是把当前指针p向高地址移动一个存储单元。
若p++作为操作数,则先引用p,再将p向高地址方向移动一个存储单元块,而++p是先移动指针后再引用p。
p--,--p,当前指针p向低地址移动一个存储单元块。
若p--作为操作数,则先引用p,再将p向低地址移动一个存储单元。而--p是先移动指针后再引用p。
3.指针的关系运算
指针可以进行关系运算。在关系表达式中允许对两个指针进行所有的关系运算。若p,q是两个同类型的指针变量,则:p>q,p<q,p==q,p!=q,p>=q都是允许的。
假设p、q是指向同一数组的两个指针,执行p>q的运算,其含义为,若表达式结果为真(非0值),则说明p所指元素在q所指元素之后。或者说q所指元素离数组第一个元素更近些。
注意:在指针进行关系运算之前,指针必须指向确定的变量或存储区域,即指针有初始值;另外,只有相同类型的指针才能进行比较。