| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 469 人关注过本帖
标题:linux内核中的指针问题
只看楼主 加入收藏
jefffyang
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2011-2-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
linux内核中的指针问题
array是一个指针数组,系统中每个CPU对应于其中一个元素,每个元素为一个指向array_cache数据结构的指针
在每个array_cache数据结构之后均存放了一个指针数组,元素个数为 n ,现在为了获取这个指针数组中的最后一个元素

关键的代码如下 :
                  void *objp;
                  ac = array[smp_processor_id()];
                  objp = ((void **)(ac+1))[n-1];

我想知道为什么要用两个 * ,我觉得用一个就够了,因为ac+1就已经获得了指向array_cache数据结构之后这个指针数组的地址,
这个时候,用一次 * 就可以获得这个指针数组了,然后再用下标操作就可以得到最后一个元素
  如果哪位高手肯不吝赐教,小弟不胜感激,必将发奋图强,继续钻研linux内核以作报答,在这里先谢谢各位了!
搜索更多相关主题的帖子: linux 元素 
2011-08-26 18:21
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
收藏
得分:20 
首先array[]是一个指针数组,这个数组的元素是一个指向array_cache数据结构的指针,换句话说ac(ac = array[smp_processor_id()])
也是一个指针,且ac也指向一个array_cache数据结构,那么(ac + 1)就指向了array_cache这个数据结构下一个地址,我们假设它为地址a,
而以地址a开始,是一个指针数组,这个数组存了n个指针,假设这个指针数组为b[],那么,ac + 1 = &b[0],注意这里的两个*不是你所理解的
取值预算符,而是和void一起作为一个强制类型转换,因为ac是一个指向array_cache数据结构的指针,(void **)是强制类型转换为void类型
的指针的指针,分两次理解就是,ac是一个指针,(void *)(ac + 1)转换后由一个数据结构指针变成一个void类型的指针,再用一次*变成了
一个指针的指针,即一个指针数组的首地址,例如:int *a,我要一个指针指向它的话,就需要定义一个指针的指针,即int **b,b = &a。
不知道我这么讲,楼主是否能明白我的意思,

天道酬勤!
2011-08-26 20:08
jefffyang
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2011-2-10
收藏
得分:0 
回复 2楼 luyi_footman
2楼的解释很精辟,在这里表示真心的感谢
2011-08-27 10:31
快速回复:linux内核中的指针问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011293 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved