《《指针用法总结》.doc》由会员分享,可在线阅读,更多相关《《指针用法总结》.doc(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、原创:指针用法总结,欢迎各位坛友学习,交流,批.复制链接aa一蓑烟雨81积分67莫元0飞币注册会员 发消息电梯直达1楼发表于 2014-9-7 17:04:02|显示全部楼层|只看大图指针用法总结参考文献:1 谭浩强 C程序设计清华大学出版社 2 林锐 高质量C+/C编程指南 3 郝斌 C语言自学视频1 指针的基本性质l 指针就是地址l 一个指针变量只存放首字节地址,但指向整个变量,只占4个字节(无论指向什么类型)2 指针的重要性l 表达一些复杂的数据结构。l 快速的传递数据,减少了内存的耗用。l 使函数返回一个以上的值。l 能直接访问硬件。l 能方便的处理字符串(到0停止)l 是理解面向对象
2、语言中引用的基础。3 指针的指针l 跨函数改变变量的值使用指针。l 跨函数改变指针的值使用指针的指针。(示例1)l 操作数组用指针,操作指针数组用指针的指针4 指针与数组l 通过指针操作数组1) 数组名a代表数组首元素的地址,a是常量。2) 通过指针操作数组、字符串占用内存空间更少、运行效率更高。l 指针数组 若一个数组其元素均为指针类型变量,成为指针数组。例如:“ int *p4; ” 指针数组比较适合用于指向若干个字符串,使字符串的处理更加方便灵活。例如:char *name = “Fow”,”me”,”ku”,”qi”;void print(char *name, int n)print
3、(name, n); 指针数组做main函数的形参(实参有操作系统给出)5 指针与函数l 通过指针引用函数函数名就是指向函数入口地址的指针。一个程序中,一个指针变量可以先后指向同类型的不同函数。int max(int, int); /函数声明int (*p)(int, int); /定义指向函数的指针变量pp = max; /使p指向max函数c = (*p)(a, b); /通过指针变量调用函数maxl 函数的入口参数为指针1) 所要传递数据为非标准数据类型时更高效。2) 可在函数中修改变量的值。3) 使用const可防止数据被篡改。4) 当该入口参数为指向函数的指针,优点?(例3)void
4、 fun(int(*X1)(int),int(*X2)(int,int) int a, b,i, j; a = (*X1)(i); b = (*X2)(i,j);上例中用(*X1)、(*X1)代替函数f1、f2。当函数fun调用的函数不固定时,这样比较方便。l 函数的返回值为指针一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。其概念与之前相似,只是返回的值的类型是指针类型而已。例如 “int *a(int x, int y);”6 指针与动态内存l 动态内存的构造l Malloc/free必须成对使用,谁申请谁销毁,申请后要检验是否申请成功;销毁后要将指针置为NU
5、LL。(示例2)l 动态数组 VS 静态数组,优点?1) 数组长度可变(realloc)。2)内存存毁由程序员自己控制。3) 可以跨函数使用。7 指针变量的归纳比较变量定义 类型标示 含义int i; int 定义整型变量iint *p; int * 定义p为指向整型数据的指针变量int a5; Int5 定义整型数组a,他有5个元素int *p4; int *4 定义指针数组p,他由4个指向整型数据的指针元素组成int (*p)4; int (*)4 P为指向包含4个元素的一维数组的指针变量int f(); int() f为返回整型函数值的函数int *p(); int *() f为返回一个
6、指针的函数,该指针指向整型数据int (*p)(); int (*)() P为指向函数的指针,该函数返回一个整型数int *p; int * P为一个指针变量,它指向一个指向整型数据的指针变量void *p; void * P是一个指针变量,基本型为void(空类型),不指向具体的对象,在将它的值赋给另一指针变量时由系统对它进行类型转换(自动),使之适合于被复制的变量的类型。示例1#include#includevoid main() Int *p;fun(&p);/* 函数介绍:使main函数中指针p指向一个合法的整型单元* 输入参数:q,指向指针变量的指针* 输出参数:新开辟的整型内存地址
7、* 返回值: 无*/:int fun(int *q) *q = (int *)malloc(4);示例2char *p=malloc();if(p=NULL);function(p);free(p);p=NULL;而函数function则接收参数p,如下:void function(char *p) /* 一系列针对p的操作 */Tips:sizeof(数据类型);示例3:(p271)题目:有两个整数a和b,有用户输入1,2或3。如输入1,程序就给出a和b中大者,输入2,就给出a和b中小者,输入3,则求出a与b之和。#include int main() void fun(int x, int
8、 y, int(*p)(int,int); int max(int, int); int min(int, int); int add(int, int); int a = 34, b = -21, n; print(“please choose 1,2 or 3:”); scanf(“%d”, &n);/用if语句判断该使用哪个函数 if(n = 1) fun(a, b, max);else if(n = 2) fun(a, b, min);else if(n = 3) fun(a, b, add); return 0;int fun(int x, int y, int(*p)(int, i
9、nt) int result; result = (*p)(x,y);print(“%n”, result);int max(int x, int y) int z; if(x y)z = x; else z = y;print(“max =”,);return(z);int min(int x, int y) int z; if(x y)z = x; else z = y;print(“min =”,);return(z);int add(int x, int y) int z; z = x + y;print(“sum =”,);return(z);窗体顶端窗体底端论坛公益广告:使用360
10、产品将会被封锁ID。周流氓枪毙1万次也无法弥补3721犯下的罪行。wuzhujian1126积分1112莫元0飞币金牌会员 发消息2楼发表于 2014-9-7 17:19:05|只看该作者我举个例子,能回答出来,算是C语言的指针操作及格。void test(char* p) p = abc;main() char * t= bcd; test(t); printf(%s, t);问题1:请问输出的是什么?问题2:请说明输出该结果的原因。灵活使用C语言中的指针,关键在于指针的“强制类型转换”。承接工业控制、短距无线通信、工业以太网项目。wuzhujian回复举报公益广告:发表新主题时,务必起一个
11、能说明帖子内容的清晰标题,否则将会被封锁ID(点击查看详细说明)didadida405积分250莫元90飞币中级会员 发消息3楼发表于 2014-9-7 17:24:20|只看该作者wuzhujian 发表于 2014-9-7 17:19我举个例子,能回答出来,算是C语言的指针操作及格。void test(char* p)内容不变。C是按照值传递的,不是引用传递,在函数中实际是有一个参数的拷贝过程,因此不会改变原有指针的指向想改变指针本身,用指向指针的指针自我感觉良好,不是好事回复举报公益广告:本论坛不得使用、宣传Q群。 有讨论请在论坛里进行。 违者将封锁ID.didadida405积分250
12、莫元90飞币中级会员 发消息4楼发表于 2014-9-7 17:25:34|只看该作者wuzhujian 发表于 2014-9-7 17:19我举个例子,能回答出来,算是C语言的指针操作及格。void test(char* p)uC/OS中的内存管理部分,就是强制转换指针,将一段连续的内存空间串了起来自我感觉良好,不是好事回复举报公益广告:发表招聘帖子需要缴费,有需要可以联系网站工作人员王小姐:.kalo425812积分301莫元33飞币高级会员 发消息5楼发表于 2014-9-7 19:30:53|只看该作者我也来个题,1. int main()2. 3. int a4 = 1,2,3,4;
13、4. int *ptr1 = (int *)(&a+1);5. int *ptr2 = (int *)(int)a + 1);6.7. printf(%x,%x,ptr1-1,*ptr2);8.9. return 0;10. 11.复制代码问:输出嘛?人有不为也,而后可以有为。回复举报公益广告:广告只能发在本论坛的广告区,否则将封锁ID。didadida405积分250莫元90飞币中级会员 发消息6楼发表于 2014-9-7 19:50:18|只看该作者kalo425 发表于 2014-9-7 19:30我也来个题,问:输出嘛?如果题目是这样,printf(%d,%d,ptr1-1,*ptr2
14、);试着答一下:1,0自我感觉良好,不是好事回复举报本论坛禁止与网站产品有冲突的广告,如雕刻机、PCB、空气净化器等wctmdgcd3828积分1346莫元12飞币金牌会员 发消息7楼发表于 2014-9-7 21:43:59来自手机|只看该作者wuzhujian 发表于 2014-9-7 17:19我举个例子,能回答出来,算是C语言的指针操作及格。void test(char* p)试着回答一下。打印输出的还是“bcd”因为调用test函数时,只是单向地将指针变量t内的所存的数据赋予test的形参,也就是说从源地址取出来,并不能改变源地址中的数据。所以t依旧还是指向“bcd”的。以前用指针作
15、为形参时,比较少指向字符串的,不算熟悉。回复举报wuzhujian1126积分1112莫元0飞币金牌会员 发消息8楼发表于 2014-9-7 22:07:53|只看该作者5天后,我会讲解一下我出的这道题。敬请关注。_回复举报laixiaoshuai90205积分169莫元300飞币中级会员 发消息9楼发表于 2014-9-7 23:28:21|只看该作者kalo425 发表于 2014-9-7 19:30我也来个题,问:输出嘛?假定处理器32位,小端存储。输出应该是 0x,0x。回复举报Gallen.Zhang306积分179莫元39飞币中级会员 发消息10楼发表于 2014-9-7 23:4
16、0:56|只看该作者本帖最后由 Gallen.Zhang 于 2014-9-7 23:47 编辑kalo425 发表于 2014-9-7 19:30我也来个题,问:输出嘛?32位系统下,小端模式输出 4, 大端模式输出 4,100回复举报kalo425812积分301莫元33飞币高级会员 发消息11楼发表于 2014-9-7 23:51:13|只看该作者给大家分享个C语言的书,C语言深度解剖:解开程序员面试笔试的秘密.pdf我5楼那个问题,在该书“4.4.4地址的强制转换” 有详细说明,我就不献丑解释啦哈哈人有不为也,而后可以有为。回复举报kalo425812积分301莫元33飞币高级会员 发
17、消息12楼发表于 2014-9-7 23:52:02|只看该作者Gallen.Zhang 发表于 2014-9-7 23:4032位系统下,小端模式输出 4, 大端模式输出 4,100bingo人有不为也,而后可以有为。回复举报xCamel212积分158莫元0飞币中级会员 发消息13楼发表于 2014-9-8 04:31:47|只看该作者wuzhujian 发表于 2014-9-7 17:19我举个例子,能回答出来,算是C语言的指针操作及格。void test(char* p)答案为:bcd理由:t为指向字符串常量bcd的指针,当调用test(t);时将t的内容传给了指针p,此时p也指向了b
18、cd。此后p=abc;又将p指向了字符串常量abc;当函数返回时,并不会对t指向的内容做修改。所以t指向的内容还是bcd。test()函数中的语句修改的是指针p的内容,而不是指针p所指向的内容,这是关键。回复举报didadida405积分250莫元90飞币中级会员 发消息14楼发表于 2014-9-8 09:29:06|只看该作者我给10楼补充一个详细的解释,以将功补过回复举报gonboy45积分29莫元102飞币新手上路 发消息15楼发表于 2014-9-8 11:39:00|只看该作者kalo425 发表于 2014-9-7 19:30我也来个题,问:输出嘛?C语言中的怪异 指针用法工作中
19、有多少会用?回复举报didadida405积分250莫元90飞币中级会员 发消息16楼发表于 2014-9-8 13:26:31|只看该作者gonboy 发表于 2014-9-8 11:39C语言中的怪异 指针用法工作中有多少会用?这个不是用不用的问题,而是基础知识的范畴。许多人动不动就说温习C语言,其实根本不是温习,而是学习而已,因为掌握的C的东西太浅层太窄。当然我不是说自己掌握的很多,但起码我一直在认真学。另外,上面这些“奇技淫巧”正是考察对指针的理解(尤其强制转换)、内存布局等,如果不知道这些知识,就回答不上来这类题目了,只是反感。另外多说一句,uC/OS的动态内存管理就是活用指针的一个
20、例子,通过强制转换,将内存串了起来,不信你看一下内存管理的那个函数其中的一个代码片段如下:plink = (void *)addr; /* Create linked list of free memory blocks */ pblk= (INT8U *)(INT32U)addr + blksize); for (i = 0; i (nblks - 1); i+) *plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */ plink = (void *)pblk; /* Position toNEXT b
21、lock */ pblk= (INT8U *)(INT32U)pblk + blksize); /* Point to the FOLLOWING block */ *plink = (void *)0; /* Last memory block points to NULL */你会认为这些是“怪异”的用法吗?自我感觉良好,不是好事回复举报why800216积分157莫元3飞币中级会员 发消息17楼发表于 2014-9-8 13:32:15|只看该作者收藏,谢谢分享。回复举报carollim502积分6莫元602飞币高级会员 发消息18楼发表于 2014-9-8 15:11:31|只看该作者
22、回复举报witlong132积分89莫元1179飞币注册会员 发消息19楼发表于 2014-9-8 15:12:49|只看该作者指针用法,学习。回复举报bli19192积分153莫元348飞币注册会员 发消息20楼发表于 2014-9-8 15:20:55|只看该作者didadida 发表于 2014-9-7 17:24内容不变。C是按照值传递的,不是引用传递,在函数中实际是有一个参数的拷贝过程,因此不会改变原有指针 .问下高手,那怎么才能打印出abc呢?回复举报cat_li835积分651莫元0飞币高级会员 发消息21楼发表于 2014-9-8 15:30:31来自手机|只看该作者好文,非常
23、不错回复举报jasonzhu8888214积分63莫元48飞币中级会员 发消息22楼发表于 2014-9-8 15:32:47|只看该作者整体还是要看编译器支持啊,比如函数指针,一些编译器就不支持回复举报didadida405积分250莫元90飞币中级会员 发消息23楼发表于 2014-9-8 17:30:30|只看该作者bli19 发表于 2014-9-8 15:20问下高手,那怎么才能打印出abc呢?我不是高手,你要是踏踏实实学,也能学会啊,可是浮躁的太多了。讽刺的是,我也很浮躁。void test(char* p)/指向指针的指针 *p = abc;/*p即为p中存储的那个指针,这里即为
24、指针tmain() char * t= bcd; test(&t);/取指针t的地址,也就是指向指针t的指针的值 printf(%s, t);有图有真相,说实话画个图的过程中加深了自己理解,画起来没想象的那么快啊有不对的地方请大家指出来自我感觉良好,不是好事回复举报takashiki1443积分1364莫元120飞币金牌会员 发消息24楼发表于 2014-9-8 17:53:03|只看该作者xCamel 发表于 2014-9-8 04:31答案为:bcd理由:答案是对的,理由大多数情况下是错误的,嘿嘿。你忘了编译器有一项特性:“优化”。回复举报ccje211积分137莫元333飞币中级会员 发
25、消息25楼发表于 2014-9-8 18:08:42|只看该作者谢谢分享。回复举报s200积分152莫元39飞币中级会员 发消息26楼发表于 2014-9-8 18:10:50|只看该作者经典好像没放对地方吧 这里是stm区回复举报zouguolvyi8积分56莫元0飞币新手上路 发消息27楼发表于 2014-9-8 18:17:14|只看该作者kalo425 发表于 2014-9-7 19:30我也来个题,问:输出嘛?4,2。我C语言一级都没过的,回复举报xCamel212积分158莫元0飞币中级会员 发消息28楼发表于 2014-9-8 18:56:45|只看该作者takashiki 发表
26、于 2014-9-8 17:53答案是对的,理由大多数情况下是错误的,嘿嘿。你忘了编译器有一项特性:“优化”。 .愿闻其详,谢谢回复举报zulu213积分66莫元45飞币中级会员 发消息29楼发表于 2014-9-8 19:48:41|只看该作者先学习再来看题回复举报huangrui228积分63莫元9飞币中级会员 发消息30楼发表于 2014-9-8 19:54:33|只看该作者谢谢分享回复举报foxcase244积分185莫元171飞币中级会员 发消息31楼发表于 2014-9-8 20:08:49|只看该作者深奥的 不知道如何搞了回复举报takashiki1443积分1364莫元120飞
27、币金牌会员 发消息32楼发表于 2014-9-8 20:23:10|只看该作者xCamel 发表于 2014-9-8 18:56愿闻其详,谢谢对于优化的程序:p = abc; 这条语句的p前面没有加volatile关键字,而且它只写了从来没有被读取过,因此这条语句没有任何副作用,编译器会将它优化掉而不产生任何代码。有些编译器优化更厉害,它发现整个test函数根本没有做任何有意义的事情,连函数调用都会被优化掉。对于不优化的程序:你的分析是对的。回复举报brwang1983205积分145莫元1008飞币中级会员 发消息33楼发表于 2014-9-8 20:28:44|只看该作者收藏学习回复举报b
28、li19192积分153莫元348飞币注册会员 发消息34楼发表于 2014-9-8 22:41:31|只看该作者本帖最后由 bli19 于 2014-9-9 00:16 编辑takashiki 发表于 2014-9-8 20:23对于优化的程序:p = abc; 这条语句的p前面没有加volatile关键字,而且它只写了从来没有被读取过,因 .我只是将main里改成char * t= NULL;就可以打出abc了,为啥呢?-不好意思,弄错了,得出的零指针。回复举报ddz123abcdef253积分127莫元87飞币中级会员 发消息35楼发表于 2014-9-8 22:52:19|只看该作者C
29、语言不容易啊。多看看回复举报青龙212积分140莫元180飞币中级会员 发消息36楼发表于 2014-9-8 22:54:09|只看该作者嘿嘿,顶一下顶一下回复举报wangpengcheng2512积分195莫元828飞币金牌会员 发消息37楼发表于 2014-9-8 23:24:35来自手机|只看该作者didadida 发表于 2014-9-7 17:24内容不变。C是按照值传递的,不是引用传递,在函数中实际是有一个参数的拷贝过程,因此不会改变原有指针 .用return赋值也可以吧?回复举报wangpengcheng2512积分195莫元828飞币金牌会员 发消息38楼发表于 2014-9-
30、8 23:37:37来自手机|只看该作者wuzhujian 发表于 2014-9-7 17:19我举个例子,能回答出来,算是C语言的指针操作及格。void test(char* p)这么多人,呵呵,我也说说我的理解,函数的参数跟函数的局部变量一样,都是先从寄存器 r0开始定义的,这就很好理解了,先把t的内容给r0,然后改变r0的值,最后问t是多少,这不白问么,肯定没变回复举报didadida405积分250莫元90飞币中级会员 发消息39楼发表于 2014-9-9 00:37:43|只看该作者wangpengcheng 发表于 2014-9-8 23:24用return赋值也可以吧?你是说把指
31、针作为函数返回值呗,不过我怎么感觉这种用法是错误的呢?临时变量退出函数后被销毁了吧,感觉全局变量应该可以。求证实自我感觉良好,不是好事回复举报ZDHCKJS81积分71莫元144飞币注册会员 发消息40楼发表于 2014-9-9 08:04:59|只看该作者多谢,很多收获回复举报weiming403366积分61莫元30飞币注册会员 发消息41楼发表于 2014-9-9 08:11:17|只看该作者为什么不参考一本C和指针的书回复举报yang9769246积分1089莫元54飞币中级会员 发消息42楼发表于 2014-9-9 08:40:52|只看该作者确实是很容易犯错的点受教了坐楼和各位学习
32、回复举报RainKing535积分279莫元1764飞币高级会员 发消息43楼发表于 2014-9-9 09:02:15|只看该作者支持.不错.回复举报RudeBoy193积分159莫元423飞币注册会员 发消息44楼发表于 2014-9-9 09:23:09|只看该作者xCamel 发表于 2014-9-8 04:31答案为:bcd理由:都是高手啊学习了回复举报yuxiang2267积分195莫元111飞币中级会员 发消息45楼发表于 2014-9-9 09:29:58|只看该作者支持原创回复举报wangpengcheng2512积分195莫元828飞币金牌会员 发消息46楼发表于 2014
33、-9-9 09:31:52|只看该作者didadida 发表于 2014-9-9 00:37你是说把指针作为函数返回值呗,不过我怎么感觉这种用法是错误的呢?临时变量退出函数后被销毁了吧,感觉 .你看看我38楼的回复,再加上return, 用的时候t=test(t); 意思就是再将R0赋值给t,这样它销毁的是R0,但是你已经将值返回了!FreePro for kinetis脱机下载器回复举报guyue180201积分163莫元63飞币中级会员 发消息47楼发表于 2014-9-9 09:35:13|只看该作者学习一下。回复举报Ourstory216积分47莫元153飞币中级会员 发消息48楼发表
34、于 2014-9-9 10:03:39|只看该作者mark,收藏。回复举报luohui5003216积分169莫元120飞币中级会员 发消息49楼发表于 2014-9-9 10:15:15|只看该作者顶一个 收藏了。回复举报wangqun243积分175莫元138飞币中级会员 发消息50楼发表于 2014-9-9 10:18:35|只看该作者总结的好。!回复举报crazydtone450积分314莫元12飞币中级会员 发消息51楼发表于 2014-9-9 10:21:04|只看该作者wuzhujian 发表于 2014-9-7 22:075天后,我会讲解一下我出的这道题。敬请关注。_期待.一种信念,一个承诺,就这样坚持着!确定一个方向走下去回复举报xCamel212积分158莫元0飞币中级会员 发消息52楼发表于 2014-9-9 11:10:50|只看该作者takashiki 发表于 2014-9-8 20:23对于优化的程序:p = abc; 这条语句的p前面没有加volatile关键字,而且它只写了从来没有被读取过,因 .原来如此,谢谢,学习了。回复举报lce102积分90莫元54飞币注册会员 发消息53楼发表于 2014-9-9 11:12:31|只看该作者收藏一个,谢谢回复举报LVmcu457积分354莫元