xuezha009
xuezha009
采纳率40.9%
2018-02-01 12:47 阅读 1.1k

C语言指针 问题 请大神们 解答

5

这个问题在http://ask.csdn.net/questions/679023?page=2 在这个链接问过一次 回答人不少 不知道为什么没有 一个人 解释出原因 我想问问https://www.jianshu.com/p/6ad68f2bac5e链接里的代码为什么用Student s1 =* (Student *)a; 而不是 Student s1 = (Student)a; 第二个我运行是错的

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • 已采纳
    qq981091829 有点贪玩 2018-02-01 13:02

    Student a[] 这是a的定义,a本身的含义就是一个指针,类型为student*,指向数组的首地址。
    第一种Student s1 =* (Student )a中 a本身就是student所以 (Student )a相当于没作用,前面还有一个就把 a解引用,就是一个Student对象了
    第二种Student s1 = (Student)a 把一个指针强转成Student对象,这应该是有问题的

    点赞 评论 复制链接分享
  • qq981091829 有点贪玩 2018-02-01 13:06

    这个为什么会自动删掉很多 *

    点赞 评论 复制链接分享
  • we7765604 we7765604 2018-02-01 13:32

    利用指针的观点来解释:
    s1 =* (Student *)a;
    *加指针是去指针指向的地址中的值。
    得出来的值不会指向a的值。

    点赞 评论 复制链接分享
  • we7765604 we7765604 2018-02-01 13:35

    接上面回答:
    s1 =* (Student *)a;
    相当于
    Student = 1student
    显然是错的。

    点赞 评论 复制链接分享
  • qq_38204686 das白 2018-02-01 13:43

    函数传递 const void *a = 一个student 类型的变量 则 a相当于这个变量的地址
    第二个直接将student变量的地址转为 student 这个类型

    第一个先将这个void * a 变为 student * a 这个只是改变 a 的类型 再* 将 a指向的内容放入 s1

    个人看法 仅供参考

    点赞 评论 复制链接分享
  • we7765604 we7765604 2018-02-01 13:53

    Student 是lStudent 的指针。
    那么a中存放的是lStudent结构的对象的内存地址。
    现在把a强制转换为二级地址,那么*a指向的是lStudent对象的第一个元素的值,
    问题是它把结构体的成员变量的值当成了Student类型的指针的值,
    所以这种是错误的用法。

    点赞 评论 复制链接分享
  • desert187 lionchan187 2018-02-01 15:33

    对象直接存储了数据,而指针中存储的是对象在内存中的地址,通过在指针前加*告诉计算机通过该地址去间接获取对象。
    链接1中的comp函数用于qSort中,真正调用时传递Student对象的地址(也就是指针),而非Student本身。
    链接2中comp(a[0], a[1])的写法有问题,a[0], a[1]是Student对象,而comp函数只接受Student指针类型,应该改为comp(&a[0], &a[1])。
    comp函数的参数a,b是void*类型的指针,这种类型指针大部分情况下不能直接使用,需先指定指针的类型,所以有了(Student *)a。
    s1,s2是Student对象而非指针,为其赋值需要在指针前加*号,因此有了*(Student *)a。
    Student s1 = (Student)a这种写法错将指针当作对象使用,导致s1被错误赋值。

    点赞 评论 复制链接分享

相关推荐