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

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

7个回答

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

qq981091829
有点贪玩 发现少了好多* 第一种Student s1 =* (Student* )a中 a本身就是student* 所以 (Student *)a相当于没作用
一年多之前 回复

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

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

xuezha009
xuezha009 回复we7765604:为哈要转换成二级 呢 大佬详细解释下呗
一年多之前 回复
we7765604
we7765604 回复xuezha009: a是一级指针
一年多之前 回复
xuezha009
xuezha009 a是二级指针还是一级指针
一年多之前 回复

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

qq_37384271
qq_37384271 指针位置错了
一年多之前 回复
xuezha009
xuezha009 函数com的参数是二级指针还是一级
一年多之前 回复

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

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

个人看法 仅供参考

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

xuezha009
xuezha009 现在把a强制转换为二级地址,那么*a指向的是lStudent对象的第一个元素的值 为啥呢 二级 一级 元素 *二级得到的是一级的值也就是元素的地址啊 怎么能是值呢
一年多之前 回复

对象直接存储了数据,而指针中存储的是对象在内存中的地址,通过在指针前加*告诉计算机通过该地址去间接获取对象。
链接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被错误赋值。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!