基础知识:
字节(Byte):一字节有八位(bit)。
1B(Byte,字节) = 8 bit;1KB = 1024 B;.
ASCII码:是一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值-128,最大值127。一个ASCII码就是一个字节。一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
8.1-8.3指针基础
因为32位系统中,内存单元的地址将用4个字节表示,也就意味着保存一个指针要占用4个内存单元。
需要首先定义指针指向的数据类型,一个指针变量只能指向与其类型说明一致的变量。(因为数据类型不同,指针做加减运算时指针移动的字节数不同)。
指针变量需要先进行初始化(int *p; p = NULL;)。
&p表示变量p的首地址(取地址运算符)。
变量声明中*p代表声明指针P,表达式中的*p则代表指针p指向的变量。
指针变量的赋值只能赋予地址
数组名表示数组的首地址,因此可以赋予指针变量。
e.g.
int a[5],*point;
point = a;-à等效于point = &a[0];
(这里可以看出数组名其实就是一个指针(但是不能进行加减计算),在这里同p等价了)
8.4-8.5指针与数组的关系
指针的运算:
指针的加减整数p++/p--,就是指针指向后/前一个基类型元素的内存单元,例如int型就移动4个字节,因为int变量占4个字节。
两指针变量相减,用于同一数组中计算相差数组元素个数。
P1>P2----------P1的地址值更大。
多维数组:
二维数组排列方式为逐行排列,因此地址位序也是按逐行递增。
指针变量指向一行数据时,int(*p)[n];其中n为该行数组元素个数。——数组指针
a[i]+j是一个地址,*(a+i)+j与其相同;
a[i][j]是数组元素的值,*(*(a+i)+j)与其相同;
数组中形如 *(a); *(a + 1); *(a + 1) + 2)均为地址;如下图所示:
8.6指针和字符串
字符串定义:char name[] = “wuyunhui”; 因此指针的类型必须也为char(同字符串类型);用printf()函数的格式字符“%s”或者puts(name)来输出字符串name。
数组名name表示数组的首地址(同上小节),
字符串常量只能在初始化数组时一次性保存到数组的各元素中;数组定义后,要改变字符数组的值,就只能逐个修改数组元素的值。
e.g.
char s[] = “you are so clever”;
是正确可行的,但是以下的语句却不能被编译;
char s[80]; s = “you are so clever”;
8.7指针数组
具有相同储存类型和指向相同数据类型的指针变量。
int (*p) [5]; ——————数组指针
int *p [5]; ———————指针数组
相比于数组指针,指针数组更节省内存。