闪闪红星向太阳
2015-08-11 00:38
采纳率: 100%
浏览 2.6k
已采纳

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

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

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

 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前面为什么不能加*。
但是为什么下面进行冒泡排序赋值的时候就必须要加*

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • inc1ud3 2015-08-11 01:37
    已采纳

    (p+j)->name已经是字符串了不需要加*,举个例子吧,定义一个结构体

     typedef struct Stu {
         char name;
         int age;
     };
     //在声明一个这个结构体的变量
     struct Stu stu1;
     //定义一个指针
     struct Stu *p;
     p=&stu1;
     p->name = stu1->name;
    

    去访问结构体stu1里面的成员时,使用stu1->name;那么将stu1的地址传给指针p即:p=&stu1,那么stu1和指针p存储的
    都是这个结构体变量的内存地址,可以stu1->name,也就可以p->name;
    后面的赋值运算是对结构体变量的赋值,当然要使用解引用符了。

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • fly 100% 2015-08-11 01:26

    int __cdecl strcmp(const char src,const char *dst)
    {
    int ret=0;
    while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
    ++src,++dst;
    if(ret ret=-1;
    else if(ret>0)
    ret=1;
    return(ret);
    }
    上面是strcmp源码 里面会对参数进行一次指针取值操作的 相当于加
    所以外面就不用加了

    评论
    解决 无用
    打赏 举报
  • vincent_long2002 2015-08-11 02:09

    (p+j)->name等同于(*(p+j)).name,即引用结构体变量的成员,按C语言规则是不需要*。
    而 *(p + j) = *(p + j + 1);是给结构体变量赋值(存储单元的内容),所以需要指针运算符。
    谭浩强的书里面都有详细的说明。

    评论
    解决 无用
    打赏 举报
  • CrzayCodess 2015-08-11 02:30

    strcmp函数里面需要的是两个字符串或者字符指针,strcmp比较的是两个字符串,不是比较指针,(p + j) -> name和(p + j + 1) -> name是通过结构体指针来
    访问结构里面的字符串,而在交换的时候两个指针的指向没有变,只是交换两个指针所指内存单元里面的值,不这样做的话,操作的结果就无法返回

    评论
    解决 无用
    打赏 举报
  • 闪闪红星向太阳 2015-08-11 04:51

    谢谢各位前来解答,看了各位的答案,疑问也解开了。
    p->name是直接取出来这个结构体里name这个成员变量字符串其作用相当于(*p).name,
    说的更直白点,就是,有*,就不能使用->,不知道我这样理解对不对

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题