关于结构体指针问题。什么时候在指针前面加*号,什么时候不加

闪闪红星向太阳 2015-08-11 08:45:20


我在做一道对结构体数组,按姓名升序进行冒泡排序的题的时候始终不理解指针什么时候加“*”什么时候不加*。

下面上我的代码。
结构体定义

typedef struct array{
int a;
char b;
}Array;

为结构体赋值

Stu student[5] = {
{"uioyi",'m',95,58},
{"asdf",'m',88,28},
{"cvb",'m',93,37},
{"aa",'m',60,49},
{"tyu",'m',99,57}
};

下面重点来了,函数

void sortedByName(Stu *p,int count){
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - 1 - i; j++) {
if (**strcmp((p + j) -> name, (p + j + 1) -> name)** > 0 ) {
Stu temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
}
}
}

请大神为我回答一下,在函数if比较的冒泡排序中,为什么strcmp函数中俩个相比较的指针(p + j) -> name和(p + j + 1) -> name前面为什么不能加*。
但是为什么下面进行冒泡排序赋值的时候就必须要加*
...全文
1985 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-02
  • 打赏
  • 举报
回复
struct _S {
 int F;
} S,*pS=&S;

pS->F
//等价于
(*pS).F
布拉格曼 2015-12-01
  • 打赏
  • 举报
回复
对于简单的提取成员情况: 如果对指针变量做解引用了(即其前面出现了*),则引用结构体成员时用点(.)运算符 如果对指针变量没有解引用,则引用结构体成员时用指针(->)运算符 如果楼主要用结构体指针的值,就是加*号的 如果是对同类型的指针变量进行相互赋值传递,则是不加*号的,相当于把指针变量内部的值(指向结构体对象的首地址)当作一个无符号整形进行对比和计算(但是指针值的计算一般是比较是否相同,或者相隔多少); 这个讨论很有趣,大家继续~
paschen 2015-08-11
  • 打赏
  • 举报
回复 1
不加*是指针,加了*是取指针所指向的值 另外(p + j) -> name也可以写成(*(p + j) ).name ->这个符号用于指针
zilaishuichina 2015-08-11
  • 打赏
  • 举报
回复
引用 楼主 o0Joker0o 的回复:
在函数if比较的冒泡排序中,为什么strcmp函数中俩个相比较的指针(p + j) -> name和(p + j + 1) -> name前面为什么不能加*。 但是为什么下面进行冒泡排序赋值的时候就必须要加*
问: (p + j) -> name和(p + j + 1) -> name前面为什么不能加*? 答: p 是Stu * 类型的一个指针变量 p + j 也是Stu * 类型的一个指针变量 p + j + 1也是Stu * 类型的一个指针变量 用结构体(或者是类)的指针去获取该结构体(或者是类)的成员变量的值有两种方法 1是用->运算符: p->name, 2是用*运算符:(*p).name 所以你可以写成(p + j) -> name,(p + j + 1) -> name 也可以写成 (*(p + j)).name,(*(p + j + 1)).name 问: 但是为什么下面进行冒泡排序赋值的时候就必须要加*? 答:*运算符的运算结果是将指针类型运算成结构(或者是类类型) p 是Stu * 类型的一个指针变量 *p则是Stu 类型的一个变量 所以可以Stu temp = *(p + j); 当然,你也可以直接用->运算符,对Stu 的每个成员挨个赋值:如下 Stu temp; temp.name = (p + j)->name; temp.XXX= (p + j)->XXX;
fly_dragon_fly 2015-08-11
  • 打赏
  • 举报
回复
类型要一致 , strcmp第一个参数是const char *, 而name的类型刚好是, 如果*name, 类型就是const char, 就不匹配了,同样, p的类型是Stu*, 你的temp类型是Stu, 不能匹配,
pkuzhx 2015-08-11
  • 打赏
  • 举报
回复
我是小弱,我也不太懂,我来抛砖,说错了大神来拍砖。。 (p + j) -> name:p本身是指针了,你要加*,写成*(p + j). name应该也可以啊。 下边加*,是对指针所指的地址进行操作,这样才能把实参对应的数据修改,否则只是交换形参指针,实参内容没有任何变化,可以参考交换函数void swap(int a, int b) 和 void swap(int* a, int* b)
lm_whales 2015-08-11
  • 打赏
  • 举报
回复
(p + j) -> name 可以匹配指针 (p+j) 指向结构数组第j个元素的指针 name 结构的成员。是个数组 (p + j) -> <==>(* (p + j)).name 这是个数组 其中 name 是结构的数组成员的名字 . 表示取结构的成员 .name 也就是数组 name 这部分 数组(名) 可以匹配指针参数

70,024

社区成员

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

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