【考研】——指针小结

来源:互联网 发布:网络教学软件 编辑:程序博客网 时间:2024/06/05 18:22

前言

    上一篇博客涉及到指针,这次我们就一层一层剥开他的心,看看这个使c语言以快速精炼著称的指针到底是何方神圣。一言以蔽之,指针即地址,地址即指针~

遇见指针

上图:
这里写图片描述
说明:
    我画的是一个二维数组,这栋楼有好多层,每层都是一个一维数组包含好多屋,每个屋里又是一个一维数组包含好多小人。4楼指向的是屋数组第一个元素的位置即楼梯口会议室的地址;12期屋指向的默认是1号小人的地址。

1.对指针变量的理解

    类型名 * 指针变量名 如: int *P
    含义有两层:(1)指向存储单元的地址 (2)存储单元的类型

    为什么要标明存储单元的类型?
    因为在内存中是按一维的线性存储的,比如int*p, p是指向一个int数据的指针,int占4个字节,那么p++指向的是第二个int数据,具体位置就是1+4=5。总的来说,指明类型为了算地址方便。

    在c中,只能实参给形参传值,形参不为实参传值。

2.初始化

int * p = &a[0];

    等价于:

int *p;p=&a[0];

    也可以写成:

int *p=a;  //p指向数组a的地址即a首元素的地址

3.指针变量比较

1. int *p[4]   指针型数组,本质是数组,包含4个整型指针2. int(*p)[4]  数组的指针,本质是一个指针,指向一个包含4个整型数据的数组3. int *P()    本质是一个函数,返回值是一个指向整型数据的指针4. int (*p)()  本质是一个指针,指向函数的入口地址,该函数的返回值是int型的5. int **p     指向指针的指针,即指向地址的地址;如上图4楼是个地址指向12期,12期这个地址应指向int型数据;6. void *p     p是一个指针变量,不指向具体的对象;在用的时候需要强制类型转换

4.指针运算

1. p++; *p;      指向a[1],取出a[1];2. *p++   取出a[0],再指向a[1]; 从右向左运算,先计算p++,但是p++是先运算后加加,所以取值的时候指针还没有指向下一个元素;3. *(p++) 取出a[0],指向a[1];   *(++p)  指向a[1],取出a[1];4.++(*p)   取出a[0],然后a[0]+1;5.*(p--)   取出p指向的值,指针指向它的上一个元素;  *(--p)  指针指向上一个元素,再取值;

5.二维数组的指针记忆

int a[2][2] = {1,3,5,7}a, *a     //0行首地址和0行0列元素地址a[0],*(a+0)   //都是0行0列地址&a[0],&a[0][0]   //0行首地址和0行0列元素地址a[1],a+1    //1行0列地址,1行首地址&a[1][0],*(a+1)+0   // 1行0列元素地址a[2],*(a+2)    //2行0列元素地址&a[2],a+2     //2行首地址  

6.精妙之处

把一个字符串复制给另一个字符串变量,有几种方法:
第一种:while循环
1. void copy_string(char * from, char * to)
{
while((*to = *from)!='\0')
{ to++; from++}
}

说明:先赋值后判断;’\0’表示空字符串; 先赋值会把from的’\0’赋给to的。
2. {while((*to++ = *from++)!='\0');}
说明:’\0’的ASCII值为0,*from != ‘\0’ 等于 *from != 0 等于 *from; 因此有下面的最简版。
3. {while(*to++ = *from++);}
还可以写成:

  while(* from)      *to++ = *from++;      *to = '\0';

第二种:for循环

for(;(*to++ = from++)!=0;);即:for(;*to++ = from++;);

第三种:数组类型的

void copy_string(char from[],char to[]){char *p1, *p2;p1 = from; p2 =t0;while((*p2++ = *p1++)!='\0');}

说明:数组可以用一个指针接受,以为数组名代表数组的首地址。

7.动态分配内存

(1) malloc

void * malloc(unsigned int size);

说明:开辟size这么大的空间,一维的,返回值是一个指针,只提供地址,不指向任何类型的数据。

(2) calloc

void * calloc(unsigned n, unsigned size);

说明:开辟n个size这么大的空间,是一个数组。

(3) free

void free(void * p);

说明:释放p指向的动态空间,没有返回值。

(4) realloc

void * realloc(void *p, unsigned int size);

说明:将p指向的动态空间大小改变为size。

举例:

int *p = (int *)malloc(5 * sizeof(int));

说明:开辟5个int那么长的空间,把空间的首地址转换成int* 型的,赋给指针p。

结语

    通过总结,对指针的理解更清晰了。好记性不如烂笔头啊,之前都是懒的记,但是理解不记下来,过不了多久就忘光了,好好写博客,加油~

0 0
原创粉丝点击