免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: MMMIX
打印 上一主题 下一主题

[C] 拨开迷雾见真知--C语言中指针的使用(获奖名单已公布-2014-4-21) [复制链接]

论坛徽章:
2
申猴
日期:2014-04-17 14:37:17CU十四周年纪念徽章
日期:2018-06-23 16:03:03
21 [报告]
发表于 2014-03-14 21:45 |只看该作者
看过c语言经典3本书,感觉对c语言认识更深一层(主要之前太菜了)。对指针也没有以前害怕感觉。

论坛徽章:
0
22 [报告]
发表于 2014-03-15 00:36 |只看该作者
还有一本经典书叫《c与指针》

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
23 [报告]
发表于 2014-03-15 07:16 |只看该作者
本帖最后由 Ager 于 2014-03-15 07:16 编辑

照话题要求,准备发一篇关于“在C中使用指针的心得体会”的回帖。

正在写作中,@starwing83 是主要贡献者。

请允许我先占个位子,哈哈。。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
24 [报告]
发表于 2014-03-15 13:40 |只看该作者
bfdhczw 发表于 2014-03-14 15:18
忘了那些指针类型吧,什么int型指针,char型指针,指向指针的指针,函数指针……  没那么麻烦,记住一点,指针就是地址,别无其他。


当然要管类型了,不然做数学运算何解?

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
25 [报告]
发表于 2014-03-15 13:51 |只看该作者
回复 23# Ager


对搞底层的人来说,心得就一句话:指针暴露了所有的抽象内存,Period。

论坛徽章:
0
26 [报告]
发表于 2014-03-15 14:07 |只看该作者
int p;    //这是一个普通的整型变量
int *p;  //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,
         //说明指针所指向的内容的类型为int型.所以P是一个返回整型数据的指针  
int p[3];    // 首先从P处开始,先与[]结合,说明P是一个数组,然后与int结合,
        // 说明数组里的元素是整型的,所以P是一个由整型数据组成的数组
int *p[3]; //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组,  
     //然后再与*结合,说明数组里的元素是指针类型, 然后再与int结合,      
    //说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据          //的指针所组成的数组
int (*p)[3]; //首先从P处开始,先与*结合,说明P是一个指针,然后再与[]结合       //(与"()"这步可以忽略,只是为了改变优先级), 说明指针所指向的       //内容是一个数组,然后再与int结合, 说明数组里的元素是整型的.          //所以P是一个指向由整型数据组成的数组的指针
int **p;   //首先从P开始,先与*结合,说是P是一个指针,然后再与*结合, 说明指       //针所指向的元素是指针,然后再与int结合, 说明该指针所指向的元素       //是整型数据.由于二级指针以及更高级的指针极少用在复杂类型中, 所          //以后面更复杂的类型我们就不考虑多级指针了, 最多只考虑一级指针.
int p(int);  //从P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该       //函数有一个整型变量的参数,然后再与外面的int结合, 说明函数的          //返回值是一个整型数据
Int (*p)(int);   //从P处开始,先与指针结合,说明P是一个指针,然后与()结合,//说明指针指向的是一个函数,然后再与()里的//int结合,说明 //函数有一个int型的参数,再与最外层的int结合,说明函数的 //返回类型是整型,所以P是一个指//向有一个整型参数且返回 //类型为整型的函数的指针  
int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂  //从P开始,先与()结合,说明P是一个函数,然后进入()里面, //与int结合,说明函数有一个整型变量参数,然后再与外面           //的*结合,说明函数返回的是一个指针, 然后到最外面一层,          //先与[]结合,说明返回的指针指向的是一个数组,然后再与*结          //合,说明数组里的元素是指针,然后再与int结合,说明指针指          //向的内容是整型数据.所以P是一个参数为一个整数据且返回             //一个指向由整型指针变量组成的数组的指针变量的函数.    说到这里也就差不多了,我们的任务也就这么多,理解了这几个类型,其它的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了.回复 1# MMMIX


   

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
27 [报告]
发表于 2014-03-15 18:15 |只看该作者
回复 26# 寂寞小七


    +10086

论坛徽章:
0
28 [报告]
发表于 2014-03-16 12:03 |只看该作者
感觉《C与指针》这本书写的不错)

论坛徽章:
1
摩羯座
日期:2013-11-29 18:02:31
29 [报告]
发表于 2014-03-16 12:57 |只看该作者
指针不只是C的精华,同时也是C++一些特性的实现的必须,比如说虚表,就是函数指针。我对指针的理解如下:
指针其实很简单,就是个地址。它有三个基本属性:地址属性,步长属性,数据格式化。地址属性是其最基本的属性,也是指针的定义所在。而常用的则是其步长属性和数据格式化。具体解析如下。
*****************************************************
地址属性:
比如你定义一个变量:
U16 u16Temp;
那么软件就会为你所定义的变量分配一个地址,具体这个地址在哪里?依据你所定义的变量的类型,如果是全局变量或静态(二者本质是一样的),那就在全局区中,如果是局部变量,那就在函数的栈中。可以通过&u16Temp来得到其具体的值。这是其地址属性。
*****************************************************
步长属性:
这里的步长属性是指指针在参与运算过程中,主要是加减运算,进行一个单位的加减时,其所能跨越的地址范围。比如,定义一个指针变量如下:
U16* u16pPointer = 0X12345678;
当你执行u16pPointer++时,其值变会变成了0X1234567A,注意:是从8变到A,加了2,为什么加2?因数U16占用两个字节,那么指针运算一次,其步长就是2个字节。如果你定义成U32,那么步长就是4个字节了。如果两个指针做差运算,那么得到是什么呢?比如U16* u16P1 = 0Xaaa0; U16* u16P2= 0XAAAA,如果u16P2-u16P1=?,如果直接理解,得到值将是0XAAAA-0XAAA0=A, 这样分析错了,为什么?指针另时,编译器会乘上步长,与此类似,这里也会除以步长,也就是说,两个指针相差,你得到的将是步长值,所以正确的结果是A/2=5.
*****************************************************
数据格式化
这是对步长属性的引申,比如你定义了一个结构体,
typedef struct
{

    U16 Data1;

    U8  Data2;

    U8  Data3;

}tStrTest;

这里定义了个结构体,你定义一个指针U16* u16P1=0X12345678,显然其步长是2,如果你对其做强制转化,如下所示:
(tStrTest*)u16P1,那么0X12345678开始的数据将会被编译器解析为一个结构体,也就是说,你可以使用0X12345678~0X1234567B在编译器看来,就是一个结构体, 前面两个字节是Data1,后面两个字节分别是Data2和Data3.这个技巧很有用,可以将其叫做数据流的解析,比如,在网络编程中,你将接收到的数据放到一个数组中,然后定义一个IP头结构体去解析这个数组,那么就可以对数据进行解析了.

论坛徽章:
1
摩羯座
日期:2013-11-29 18:02:31
30 [报告]
发表于 2014-03-16 12:59 |只看该作者
一个指针写一本书?指针的概念说白了,也就那几句话,几个用法而已,感觉此书可能应该不只是局限于指针本身,可能关系到指针的具体用法,比如指针在OS中的应用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP