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

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

问题描述:

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

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

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

(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;
后面的赋值运算是对结构体变量的赋值,当然要使用解引用符了。

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源码 里面会对参数进行一次指针取值操作的 相当于加
所以外面就不用加了

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

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

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