【考研】——指针小结
来源:互联网 发布:网络教学软件 编辑:程序博客网 时间: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。
结语
通过总结,对指针的理解更清晰了。好记性不如烂笔头啊,之前都是懒的记,但是理解不记下来,过不了多久就忘光了,好好写博客,加油~
- 【考研】——指针小结
- 考研小结
- 考研小结
- 考研小结
- 黑马程序员——指针学习小结
- 考研交流:幽默段子——唐僧劝悟空考研
- 我看考研(二)——考研的理由
- 研大考研——医学考研集训第一营
- 【考研】——宏观总结
- 我看考研(一)——为什么考研之考研的理由的重要性
- 指针变量的类型及含义——小结
- 黑马程序员——C语言指针使用小结
- 指针学习笔记(3)——小结
- C++系列——const,引用,指针用法小结
- 数据结构小结——顺序表(指针版)
- 指针小结
- 指针小结
- 指针小结
- 自定义View ---仿华为应用市场下载进度条
- butterknife源码解析
- MFC在VS2008中如何手动添加消息映射
- Android之静默安装和智能安装的实现方法
- JavaSE总结-IO字节流总结
- 【考研】——指针小结
- Hibernate——建立第一个hibernate项目
- Assetbundle创建与加载
- 快递查询API
- python + redis长轮询
- Java日志分享
- leetcode-74. Search a 2D Matrix
- Linux用户管理 ----- 禁止用户登陆
- 【牛腩新闻发布系统】B/S的和C/S