问题描述
- 关于结构体指针问题。什么时候在指针前面加*号,什么时候不加
-
我在做一道对结构体数组,按姓名升序进行冒泡排序的题的时候有些不理解指针什么时候加“*”什么时候不加*。下面上我的代码。
结构体定义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,
说的更直白点,就是,有*,就不能使用->,不知道我这样理解对不对