11. 下标引用、函数调用和结构成员
1. [ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符,[ ]的两个操作数是arr和9
arr[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).