11. 下标引用、函数调用和结构成员
1. [ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符,[ ]的两个操作数是arr和9arr[7]-->*(arr+7)-->*(7+arr)-->7[arr]
7[arr] = 9;
//编译器不会报错,但是不建议这样写
2. ( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
#include <stdio.h>
void test1()
{printf("hehe\n");
}
void test2(const char* str)
{printf("%s\n", str);
}
int main()
{test1(); //实用()作为函数调用操作符。test2("hello bit.");//实用()作为函数调用操作符。return 0;
}
3. 访问一个结构的成员
. 结构体 . 成员名
-> 结构体指针->成员名
错误代码(形参是实参的一份临时拷贝)
#include <stdio.h>
#include <string.h>
struct Stu
{char name[20];int age;double score;
};void set_stu(struct Stu ss)
{strcpy(ss.name, "huihui");ss.age = 20;ss.score = 100.0;
}print_stu(struct Stu ss)
{printf("%s %d %lf\n", ss.name, ss.age, ss.score);
}int main()
{struct Stu s = { 0 };set_stu(s);print_stu(s);return 0;
}
正确代码(传地址)
#include <stdio.h>
#include <string.h>
struct Stu
{char name[20];int age;double score;
};void set_stu(struct Stu* ps)
{//strcpy((*ps).name, "huihui");//(*ps).age = 20;//(*ps).score = 100.0;//或者strcpy(ps->name, "huihui");ps->age = 20;ps->score = 100.0;
}print_stu(struct Stu ss)
{printf("%s %d %lf\n", ss.name, ss.age, ss.score);
}int main()
{struct Stu s = { 0 };set_stu(&s);print_stu(s);return 0;
}
但是这样写并不节省空间,print _stu函数又会创建一个空间去存放数据,因此可以用指针的方式去访问
#include <stdio.h>
#include <string.h>
struct Stu
{char name[20];int age;double score;
};void set_stu(struct Stu* ps)
{/*strcpy((*ps).name, "huihui");(*ps).age = 20;(*ps).score = 100.0;*///或者strcpy(ps->name, "huihui");ps->age = 20;ps->score = 100.0;
}print_stu(struct Stu* ps)
{printf("%s %d %lf\n", ps->name, ps->age, ps->score);
}int main()
{struct Stu s = { 0 };set_stu(&s);print_stu(&s);return 0;
}
注:ps->等价于(*ps).