找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2930|回复: 19
打印 上一主题 下一主题
收起左侧

C语言指针的一点小疑问

  [复制链接]
回帖奖励 50 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:480137 发表于 2019-12-30 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   
1.  
     int b=5;
     int  *a = &b;  

2.
     int b = 5;
    int*    a =&b;

3.

   int b = 5  ,*a;
   a = &b;

这三种写法有区别吗

是不是都是把b的地址赋给指针变量a

如果一样的话 哪种写法比较好
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:480137 发表于 2019-12-30 11:59 | 只看该作者
还有一个问题  
int *a = &b;   (这是把b的地址赋给指针变量a)

和  *a = &b;  (这是把b的地址赋给指针变量a的存储的数据)  

为什么含义不一样呢?  
回复

使用道具 举报

板凳
ID:677461 发表于 2019-12-30 15:25 | 只看该作者
发表下个人看法,针对第一个问题:
1.以上三个写法是一样的。个人比较倾向于第三种写法。先定义变量,然后赋值。
2.   int *a = &b;是定义一个指针变量a,同时初始化。
*a = &b是一个赋值语句,所以含义不同。
回复

使用道具 举报

地板
ID:672549 发表于 2019-12-30 15:38 | 只看该作者
三者在运行编译时的效果是一致的,含义也大致相同
回复

使用道具 举报

5#
ID:672549 发表于 2019-12-30 15:41 | 只看该作者
三者运行编译的效果一样,1和2只是空格格式不同,3是先定义再赋值,最终效果是一样的,个人喜欢第一种,定义和赋值在一起,少打一行,而且可以防止后面忘记赋值
回复

使用道具 举报

6#
ID:636210 发表于 2019-12-30 18:09 | 只看该作者
实际上你自己全懂了。这个书写格式,只有软件本身认可,试了就知了。没有文章说明中间空格就不是一个定义词来的。如*  A,或:=    some;前者就是:*A,空了也是*A,等于后面的空好几个也是一个some.
回复

使用道具 举报

7#
ID:677920 发表于 2019-12-30 21:47 | 只看该作者
一个意思吧,第一种更好一点
回复

使用道具 举报

8#
ID:130230 发表于 2019-12-31 16:15 | 只看该作者
结果一样,第一种和第二种完全一样。个人决定第三种写法比较好。
回复

使用道具 举报

9#
ID:679004 发表于 2020-1-1 18:05 | 只看该作者
都一样,我觉得第一种好点
回复

使用道具 举报

10#
ID:149451 发表于 2020-1-3 08:38 | 只看该作者
这个看个人习惯,以及代码作用——是否有他人需要,选个通俗易懂的就OK
回复

使用道具 举报

11#
ID:680221 发表于 2020-1-3 09:51 | 只看该作者
三个写法都一样,一般做法是第一种,特别是在一行中定义多个变量时,简单明了,能有效区分哪些是数据变量,哪些是指针变量。至于说补充的问题,如果是单独一行来写,前面没有变量类型限定符 则*a将会被编译器认为是一个整体,表示a指针指向的int变量,也是常规的指针用法,但是你这样写的话,如果a指针没有初始化,会导致程序出现无法预测的问题,即野指针问题。
回复

使用道具 举报

12#
ID:680594 发表于 2020-1-3 17:21 | 只看该作者
结果完全一样。个人决定第三种写法比较好。先定义变量,然后赋值。清晰明了
回复

使用道具 举报

13#
ID:680657 发表于 2020-1-3 18:51 | 只看该作者
三种写法都一样,都是把b的地址赋给指针变量a,一般是写作第一种
回复

使用道具 举报

14#
ID:475247 发表于 2020-1-3 19:29 | 只看该作者
书写规范的代码让人看了赏心悦目,代码的可读性强。书写规范的代码无论对自己对别人都有好处。
回复

使用道具 举报

15#
ID:479101 发表于 2020-1-3 20:24 | 只看该作者
除了第三种,我不是很赞同这样的写法以外,第1 、2 种写法都可以。这是因为第三种会存在野指针的问题,虽然在你的编译器当中会编译通过,但是可能会导致出现不可预测的错误,毕竟你在定义*a的时候并没有初始化给它,但是在内存中会划分了某个区域给它,而这个区域的话,有可能存放着其他的数据,可能会导致一系列不可预测的错误发生。或者你在定义*a时直接赋值为空,即 int * a = NULL;然后再进行下一步操作,如:a = &b;
回复

使用道具 举报

16#
ID:676777 发表于 2020-1-3 22:06 | 只看该作者
则三种写法是一样的,但是至于哪种比较好,各有各的道理。个人建议*号跟随变量,比如(int *a)并且同时初始化,以免忘记,造成悬空指针。
回复

使用道具 举报

17#
ID:351421 发表于 2020-1-4 10:42 | 只看该作者
254zhang 发表于 2019-12-30 11:59
还有一个问题  
int *a = &b;   (这是把b的地址赋给指针变量a)

首先,3中实现的是一样的,但是第三种不太严谨,在定义的同时没有初始化,会出现野指针。他们都是实现了把b的地址放入a中,也就是指针a指向b的地址。第二个问题,第一个是定义一个指针同时初始化,第二个是把b的地址的数值放入a指向的空间中,不是b的值。
回复

使用道具 举报

18#
ID:680945 发表于 2020-1-4 12:17 | 只看该作者
一样的,看个人习惯,以及行业习惯
回复

使用道具 举报

19#
ID:481073 发表于 2020-1-4 15:47 | 只看该作者
指针就是指向地址的意思,在指针运算的过程中是在对地址进行操作,你明白这个就清楚了
回复

使用道具 举报

20#
ID:681096 发表于 2020-1-4 16:27 | 只看该作者
三种写法没有实际上的区别,但是我个人比较喜欢第一种写法,很多c语言的书上也是第一种写法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表