c中声明变量 **a和*a[]有什么区别?

afeiqiang 2009-02-09 12:55:24
如题。
在看firebirdbbs的代码时,又看到这样的代码:
#ifdef DYNAMIC_USER_RECORD
extern struct user_info * * user_record;
#else
extern struct user_info *user_record[];
#endif
两种不同的方法来声明 user_record,两者有什么区别?
...全文
409 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
afeiqiang 2009-02-13
  • 打赏
  • 举报
回复
谢谢各位的回帖,使本人受益匪浅
bfhtian 2009-02-12
  • 打赏
  • 举报
回复
简单说来就是指针和数组的区别
afeiqiang 2009-02-12
  • 打赏
  • 举报
回复
thx
ohxf1234 2009-02-10
  • 打赏
  • 举报
回复
正如楼上的兄弟们说的,一个是一个二级指针,另一个则是指针数组

他们在一些情况下是相通的,比如
int main( int argv, char **argv )
int main( int argv, char *argv[] )

但还是有差异,理解二级指针和指针数组
二级指针指向的是一个一级指针,而指针数组的也是指向一个一级指针
但操作上就有一些不同:正如楼上的兄弟说的指针的运算上
长安宁 2009-02-10
  • 打赏
  • 举报
回复
#ifdef DYNAMIC_USER_RECORD
extern struct user_info * * user_record;
#else
extern struct user_info *user_record[];
#endif

在C里面,用动态分配,是个很麻烦的问题;
所以就用指针,来指向分配的内存;
反之,简单点,用数组ok了
dongpy 2009-02-10
  • 打赏
  • 举报
回复
存储空间大小不一样。
lei_zhuyan 2009-02-10
  • 打赏
  • 举报
回复
可以去看看《C专家编程》
里面有对这个的详细解释。
szqh97 2009-02-10
  • 打赏
  • 举报
回复
指向指针的指针和指针数组
naturemickey 2009-02-10
  • 打赏
  • 举报
回复
从编译的角度来说:
a[];//这个a是直接寻址。
*a;//这个a是间接寻址。

extern时,是按照声名的方式来寻址的,所以会导致寻址错误。
但如果不做为外部变量的话,除了a[]中的a不能做为左值之外,就几乎没有什么区别了(为什么这时不会导致寻址错误?楼主可以自己想一想)。
a[]做为函数的形参的时候,编译器会把它编译成*a的,因为压入堆栈的只能是地址的值,而不能是地地址本身。

推荐楼主看一下《C专家编程》,它会介绍一点C的内存结构与编译的知识,这对理解C语言是有很大好处的。
要写一个C的编译器是很难的,但楼主也不防试一下,不成功便成仁嘛!
nullah 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenqiang35 的回复:]
作为函数参数传入时是一样的。

但是就定义而言,指针数组和指针的指针还是不一样,而extern时,就声明一个变量,两者必须一样
[/Quote]
up
naturemickey 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenqiang35 的回复:]
作为函数参数传入时是一样的。

但是就定义而言,指针数组和指针的指针还是不一样,而extern时,就声明一个变量,两者必须一样
[/Quote]这个说到点子上了,在extern时,两者如果不一样就会发生莫名奇妙的问题。
其它人只是说个表面而已——非根本问题。

在《C专家编程》中对这个有详细的解释:
a[];//这个a会返回a所在的地址。
*a;//这个a会返回a所在的地址的内容,即,a指向的地址。
xmu_才盛 2009-02-10
  • 打赏
  • 举报
回复
有区别!!!

只有当数组只有一个元素时 *a[]退化为**a

否则就是数组同指针的区别 ,难道你可以认为 a[] 就等价于*p吗?

最明显的区别就是内存操作时的灵活性的不同。
dongpy 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 afeiqiang 的回复:]
引用 12 楼 deerwin1986 的回复:
说个比较明显的区别:
当 user_record++ 的时候结果就不同了。。。呵呵

可以具体一点吗?
[/Quote]
数组名不是左值,不能执行user_record++操作,而指针可以。
afeiqiang 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 deerwin1986 的回复:]
说个比较明显的区别:
当 user_record++ 的时候结果就不同了。。。呵呵
[/Quote]
可以具体一点吗?
坐看昀起 2009-02-10
  • 打赏
  • 举报
回复
一个是二级指针。
(指向指针的指针)
另一个是指针数组。
(在c中[]运算符优先级高先结合,此刻就可以理解成数组了,前面在加上一个*指针运算符,就是指针类型的数组)
deerwin1986 2009-02-09
  • 打赏
  • 举报
回复
说个比较明显的区别:
当 user_record++ 的时候结果就不同了。。。呵呵
ForestDB 2009-02-09
  • 打赏
  • 举报
回复
一个是指针的指针,一个是指针的数组,然后最后在传参的时候都会退化。
waizqfor 2009-02-09
  • 打赏
  • 举报
回复

extern struct user_info * * user_record; //结构体2J指针
#else
extern struct user_info *user_record[]; //结构体指针数组
#endif
codesnail 2009-02-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenqiang35 的回复:]
作为函数参数传入时是一样的。

但是就定义而言,指针数组和指针的指针还是不一样,而extern时,就声明一个变量,两者必须一样
[/Quote]
同意此说法
funfunqi 2009-02-09
  • 打赏
  • 举报
回复
extern struct user_info * * user_record 中 user_record 是一个指向结构指针的指针,也就是它所所指向的是个指针。
而extern struct user_info *user_record[] 中,user_record[] 是个数组,里面盛放结构的指针,user_record单拿出来说的话,它是这个数组的首地址。
加载更多回复(7)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧