C指针的10种经典应用场合
都说指针是C语言的精髓,那指针究竟有哪些经典应用场合呢?
指针有三大类:指向数据的指针,指向函数的指针和范型指针(void*)。
其经典的应用场合,可以分为以下10类:1 与函数相关的使用
1.1 在函数中用作输出型参数,产生副作用(更新被调函数中的局部变量的值);
1.2 在函数中用作输出型参数,用于返回多个值;
1.3 在函数中用作输入型参数,指向复合类型,避免传值的副作用(性能损耗);
1.4 用做函数返回值,返回一个左值;
1.5 用于指向函数的函数指针,使用函数指针调用回调函数;
2 用于指向堆内存;
3 与void配合使用,用void*来表示一个泛型指针;
4 用于指向数组名(数组指针);
5 用于指向字符串常量(字符串常量指针);
6 在数据结构中,用作链式存储;
附加:在字符串、文件操作中跟踪操作位置;
1 与函数相关的使用
1.1 在函数中用作输出型参数,产生副作用(更新被调函数中的局部变量的值)#include void demo(int *ap,int size, int *max) { *max=ap[0]; for(int i=1;i*max) *max = ap[i]; } int main() { int max,ap[5]={1,2,8,4,5}; demo(ap,5,&max); printf("%d ",max); getchar(); return 0; }
1.2 在函数中用作输出型参数,用于返回多个值#include #include int equationSolve(double a,double b,double c,double *x1,double *x2) { int delta = a*a-4*a*c; if(delta>=0) { *x1 = (-b+sqrt(delta))/2*a; *x2 = (-b-sqrt(delta))/2*a; return 1; } else return 0; } int main(void) { double x1,x2; if(equationSolve(1,3,-14,&x1,&x2)) printf("x1=%.2f x2=%.2f ", x1,x2); else printf("无实根! "); getchar(); return 0; } /* x1=2.27 x2=-5.27 */
1.3 在函数中用作输入型参数,指向复合类型,避免传值的副作用(性能损耗)#include typedef struct Inventory{ int sku; char name[36]; char unit[12]; char supplier[48]; double price; double stock; }Inven; void demo(const Inven *p) { printf("The amounts is %f ",p->price * (*p).stock); // …… } int main() { Inven inven={123,"carban fibre","kg","uc",128,100}; demo(&inven); getchar(); return 0; }
1.4 用做函数返回值,返回一个左值#include #include #include void printIntArray(void** array, size_t length) { printf("Array at %p ", array); while (length--) { printf(" [%zu] at %p -> %p", length, array + length, *(array + length)); if (*(array + length)) { printf(" -> %d", *(int*)*(array + length)); } printf(" "); } } void* getElement(void** array, size_t index) { return *(array + index); } int main(int argc, char** argv) { const size_t n = 5; size_t i; /* n element array */ void** test = malloc(sizeof(void*) * n); i = n; while (i--) { *(test + i) = NULL; } /* Set element [1] */ int testData = 123; printf("testData at %p -> %d ", &testData, testData); *(test + 1) = (void*)&testData; printIntArray(test, n); /* Prints 123, as expected */ printf("Array[1] = %d ", *(int*)getElement(test, 1)); getchar(); return 0; }
返回左值在C++中应用比较多,特别是用引用来返回左值,如返回ostream&,或重载[]、=等运算符。
1.5 用于指向函数的函数指针,使用函数指针调用回调函数// 通用的冒泡排序函数的应用 #include #include using namespace std; template void sort(T a[], int size, bool (*f)(T,T)); // callee bool increaseInt(int x, int y) {return x0;} // callbackee4 int main() // caller { int a[] = {3,1,4,2,5,8,6,7,0,9}, i; char *b[]= {"aaa","bbb","fff","ttt","hhh","ddd","ggg","www","rrr","vvv"}; sort(a, 10,increaseInt ); for (i = 0; i < 10; ++i) cout << a[i] <<" "; cout << endl; sort(a, 10, decreaseInt); for ( i = 0; i < 10; ++i) cout << a[i] <<" "; cout << endl; sort(b, 10, increaseString ); for (i = 0; i < 10; ++i) cout << b[i] <<" "; cout << endl; sort(b, 10, decreaseString); for ( i = 0; i < 10; ++i) cout << b[i] <<" "; cout << endl; while(1); return 0; } // 通用的冒泡排序函数 template void sort(T a[], int size, bool (*f)(T,T)) { bool flag; int i, j; for (i = 1; i < size; ++i) { flag = false; for (j = 0; j #include int** demo(int r,int c) { int **ap = (int**)malloc(sizeof(int*)*r); for(int i=0;i #include #include int swap2(void *x, void *y, int size) { void *tmp; if((tmp=malloc(size)) == NULL) return -1; memcpy(tmp,x,size); memcpy(x,y,size); memcpy(y,tmp,size); free(tmp); return 0; } int main() { int a=3,b=4; swap2(&a,&b,sizeof(int)); printf("%d %d ",a,b); double c=3,d=4; swap2(&c,&d,sizeof(double)); printf("%f %f ",c,d); getchar(); return 0; }
4 用于指向数组名(数组指针)#include void funcP(int *p,int r,int c) { for(int i=0;i #include int main() { char str[80] = "This is - www.runoob.com - website"; const char s[2] = "-"; char *token; /* 获取第一个子字符串 */ token = strtok(str, s); /* 继续获取其他的子字符串 */ while (token != NULL) { printf("%s ", token); token = strtok(NULL, s); } printf(" "); for (int i = 0; i < 34;i++) printf("%c", str[i]); return (0); }
二进制文件的随机读写:
在标记文件信息的结构体FILE中,包含3个标识文件操作位置的指针。typedef struct _iobuf { char *_ptr; //文件操作的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置(即是文件的其始位置) int _flag; //文件标志 int _file; //文件的有效性验证 int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取 int _bufsiz; //缓冲区大小 char *_tmpfname; //临时文件名 }FILE;
code demo:#include // 按记录分块读写文件 #include #include #include using namespace std; class Student { public: Student(void) {} Student(int n, char nam[20], float s): num(n),score(s) { strcpy(name,nam); } void setNum(int n) { num=n; } void setName(char nam[20]) { strcpy(name,nam); } void setScore(float s) { score=s; } void show() { cout<
女性来例假时,突然流出一股血块,是身上的肉吗?大有学问姨妈,每个女人都要经历,从第一次来,到每个月规律。但是每个女人的体质不同,所以有些会腹痛,腰疼,感觉肚子有东西要掉下来一样,所以每次一来,女性的脾气都会特别暴躁。不来嘛又担
加速复苏!广东餐饮收入连续三年占比超过全国10广东作为国内食饮产业的消费重镇,其餐饮在全国地区率先复苏。日前,华南地区餐饮食品饮料消费趋势报告在深圳发布。报告显示,广东省餐饮行业自2020年后,已连续三年实现全省餐饮行业收入占
光影璀璨!杭州亚运村正式亮灯记者从杭州亚运村运行管理中心获悉,为确保赛事期间杭州亚运村运行顺利,杭州亚运村运行管理中心近日在村内进行了配电设施全负荷试验和供水压力测试。杭州亚运村位于钱塘江南岸的钱江世纪城北部
从今以后,只有这一种赚钱方式了作者水木然本文选自水木然新书人间清醒1hr世界上99的人的成长过程就像一场慢性自杀每天杀掉一点天真,杀掉一点认真,杀掉一点热情多一点伪装,多一点顺从,多一点现实。因为他们没有强大的
曾经声名显赫的明星分析师姜超,如今自己操盘基金业绩垫底曾经行业荣誉拿到手软,被称为宏观第一分析师的姜超,在两年前开启了自己的职场新旅程。2021年从卖方海通证券加盟买方中泰资管后,姜超在当年4月12日开始管理资管产品中泰超新星1号,成
(财经行情)纽约金价11日上涨新华社芝加哥4月11日电(记者徐静)纽约商品交易所黄金期货市场交投最活跃的6月黄金期价11日比前一交易日上涨15。2美元,收于每盎司2019美元,涨幅为0。76。市场分析人士认为,
华夏基金25周年答卷做资管行业的乐高,打造多资产全能平台4月7日,北京春光正盛。东三环中路7号,千禧大酒店里,华夏基金正在召开一场春季策略会,500人的会场座无虚席。这是时隔两年,华夏基金首次举办如此规模的线下策略会。做资管行业的乐高今
海外华文媒体探寻内陆首个国家级开发开放新区发展密码图为参访团参观北京理工大学重庆创新中心开发研制的分体式飞行汽车。陈超摄中新网重庆4月12日电(记者刘相琳)行走中国2023海外华文媒体高层川渝行参访团11日至12日走进内陆首个国家
浙江省侨商会倾听新侨心声知侨情暖侨心解侨难浙江省侨商会赴嘉兴开展访侨企送服务活动。刘家兵摄中新网嘉兴4月12日电(郭其钰鲍梦妮)4月11日12日,浙江省侨商会会同发改经信商务银保监侨联等部门和律师顾问团一行,赴浙江嘉兴开展
2022年报顺丰控股不惧外部压力,业绩实现较好增长今天我们一起盘下顺丰控股的2022年报表现出的核心财务特征。1公司业绩大幅增长,开源式业绩增长质量较高,且表现出较高的成长性。2022年虽面临诸多外部挑战,但公司始终坚持可持续健康
成都国际铁路港迎来首批乌兹别克斯坦粮食成都国际铁路港迎来首批乌兹别克斯坦粮食。成都国际铁路港供图中新网成都4月12日电(记者张浪)12日,首批来自乌兹别克斯坦的绿豆从撒马尔罕经霍尔果斯抵达位于成都青白江的成都国际铁路港