C语言学习之——指针

基础知识:

字节(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]; ———————指针数组

相比于数组指针,指针数组更节省内存。

猜你喜欢

转载自blog.csdn.net/guijieling/article/details/81215791