翁恺C笔记|指针
来源:互联网 发布:如何提高淘宝排名 编辑:程序博客网 时间:2024/06/10 17:54
【指针应用场景】
1.函数需要返回多个值,其中一些值可通过指针返回。传入的指针参数其实是需要保存带回结果的变量;
例程:
#include <stdio.h>#include <stdlib.h>void swap(int* a,int* b);int main(){ int a=5,b=6; swap(&a,&b); printf("a=%d b=%d",a,b); return 0;}void swap(int* pa,int* pb){ int t=*a;//t为pa指向地址所存储的值,即5 *pa=*pb;//将pa指向地址所存储的值更新为pb指向地址所存储的值,即pa地址中现在存的是6 *pb=t;//将pb指向地址所存储的值更新为t的值,即5}2.需要传入较大的数据时用作参数;
3.传入数组后对数组做操作;
4.动态申请内存。
【指针常见错误】
1.定义指针时,没有让其指向任何地址,之后直接给该指针指向地址赋值,如:
int *a;//定义了一个指针变量,不知道指向哪里(可能指向一块写操作非法区域)。*a=5;//此时写,可能会访问非法内存,段错误,程序异常终止。int *a=0;//指向0地址,0地址是一个不能随便碰的地址。*a=5;//此时写入,程序一定会崩溃。
【0地址】
1.可以用0地址做一些特殊的事情:
(1)返回的指针时无效的;
(2)指针没有被真正初始化(先初始化为0,后面如果没有对该指针真正初始化,就对其进行操作,就一定会造成程序崩溃)。
2.C语言预先定义的NULL(全大写哦~),表示0地址。
3.申明指针的时候,用NULL对其初始化是一个编程的好习惯!
【指针运算】
指针可以做加减、比较运算,不能做乘除运算。
int main(){ char ac[]={0,1,2,3,4}; char* cp=ac; printf("cp=%p\n",cp);//其中,%p表示输出指针的值。 printf("cp+1=%p\n",cp+1); int ai[]={0,1,2,3,4}; int* ci=ai; printf("ci=%p\n",ci); printf("ci+1=%p\n",ci+1); return 0;}运行结果:
sizeof(char)=1,sizeof(int)=4
指针加一表示将指针移动到下一单元。char类型占据1byte,所以cp+1地址和cp地址相差1;int类型占据4byte,所以ci+1地址和ci地址相差4。
但是,如果有int ci1=&ai[3],不要以为ci1-ci会等于18,实际等于3。表示两个地址之间有三个int单元。
【*p++】
取出p地址处的数据,然后将p移动到下一位置。
接上面一个代码段:
while(*cp!=-1) printf("%d\n",*cp++);
运行结果为:
【指针类型转换与void*】
1.无论指向什么类型,所有的指针大小都是一样的,都是地址;
2.为了避免用错指针,指向不同类型的指针不能相互赋值(不要忘记不同类型数据sizeof的结果不同哟~);
3.void*表示不知道指向什么的指针。计算时与char*相同,但不相通。常用在底层编程中。;
4.指针转换类型:int* p=&i;void* q=(void*)p;没有改变p所指变量的类型,只是q看待p所指的百年来那个为void类型。(excuse me????)
- 翁恺C笔记|指针
- C指针笔记
- 《c和指针》笔记
- C 指针学习笔记
- C和指针笔记
- 《C和指针》笔记
- c 和 指针(笔记)
- C指针学习笔记
- C和指针笔记
- 《C和指针》笔记
- C与指针 笔记
- C指针学习笔记
- C指针笔记
- C语言‘指针’笔记
- 《C和指针》笔记
- c语言指针笔记
- c语言指针笔记
- C和指针笔记
- 单链表的整表创建
- jQuery轻量级响应式图片轮播插件ResponsiveSlides.js(仅1kb)
- Miscellaneous | 图示理解卷积的物理意义
- CodeForces 659B Qualifying Contest(选2个人参加比赛)
- Charles简记
- 翁恺C笔记|指针
- 1005 大数加法(java写大数问题真有优势)
- Java中String类为什么定义为final
- 订餐系统:挑剔的用户,茁壮成长的软件
- 基础总结篇:Intent应用详解
- 51nod oj 1096 1108 1110距离之和最小【一维---三维中位数--水】
- 权限访问修饰符public,protected,private
- Redis集群环境搭建
- wireshark过滤规则简介