Student a[] 这是a的定义,a本身的含义就是一个指针,类型为student*,指向数组的首地址。
第一种Student s1 =* (Student )a中 a本身就是student所以 (Student )a相当于没作用,前面还有一个就把 a解引用,就是一个Student对象了
第二种Student s1 = (Student)a 把一个指针强转成Student对象,这应该是有问题的
这个为什么会自动删掉很多 *
利用指针的观点来解释:
s1 =* (Student *)a;
*加指针是去指针指向的地址中的值。
得出来的值不会指向a的值。
接上面回答:
s1 =* (Student *)a;
相当于
Student = 1student
显然是错的。
函数传递 const void *a = 一个student 类型的变量 则 a相当于这个变量的地址
第二个直接将student变量的地址转为 student 这个类型
第一个先将这个void * a 变为 student * a 这个只是改变 a 的类型 再* 将 a指向的内容放入 s1
个人看法 仅供参考
Student 是lStudent 的指针。
那么a中存放的是lStudent结构的对象的内存地址。
现在把a强制转换为二级地址,那么*a指向的是lStudent对象的第一个元素的值,
问题是它把结构体的成员变量的值当成了Student类型的指针的值,
所以这种是错误的用法。
对象直接存储了数据,而指针中存储的是对象在内存中的地址,通过在指针前加*告诉计算机通过该地址去间接获取对象。
链接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被错误赋值。