最基本单位 转换关系

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)所示。

 

Android 一个byte范围 1个byte_Android 一个byte范围

(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所示。

Android 一个byte范围 1个byte_Android 一个byte范围_02

(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)所示。

Android 一个byte范围 1个byte_Android 一个byte范围_03

        (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所指元素离数组第一个元素更近些。

注意:在指针进行关系运算之前,指针必须指向确定的变量或存储区域,即指针有初始值;另外,只有相同类型的指针才能进行比较。