1. 结构体指针
1—
int main() {
typedef struct teacher{
int number;
int age;
}Teacher;
Teacher tea1 = {1,28};
Teacher *p = &tea1;
printf("%d %d", tea1.age, (*p).number);
return 0;
}
直接访问:tea1.number
间接访问:
(1) (*p).number // 因为”.”的优先级高于星号,所以需要用括号将前面的指针包起来,不能省略括号
(2)p->age // ->(箭头):一个减号,一个大于号 (最常用)
int main() {
typedef struct teacher{
int number;
int age;
char *name;
}Teacher;
// 结构体指针:指向结构体变量的指针
Teacher tea1 = {1,28};
Teacher *p = &tea1;
p->number = 6;
printf("%d %d", p->number, (*p).number);
// 结构体数组指针:
Teacher tea[] = {{1, 34, "zhang"}, {2, 45, "wang"}};
Teacher *p = tea;
if (p[0].age > p[1].age) {
printf("%d %d %s\n", p->age, p->number, p->name);
}
else // 两种间接访问实现
printf("%d %d %s\n", (p + 1)->age, (*(p + 1)).number, (*(p + 1)).name);
return 0;
}
结构体数组的数组名是一个结构体指针常量
2—例题:Student stu = {1, “lan ou”, ‘m’, 95.6};将name第一个字母大写,name中所有的空格换成下划线,利用结构体指针实现。
typedef struct student{
int num;
char name[10];
char gender;
float score;
}Student;
int main() {
{
Student stu = {1, "lan ou", 'm', 95.6};
Student *p = &stu;
*(p->name) -= 32;
for (int i = 0; i < (int)strlen(p->name); i++) {
if ((*(p->name + i)) == ' ') {
*(p->name + i) = '_';
}
}
printf("%s\n", p->name);
return 0;
}
// 结果:Lan_ou
3—结构体数组与指针
typedef struct ranking{
int num;
char name[10];
int score;
}Ranking;
int main() {
Ranking rank[3] = {
{1, "Jay", 5000},
{2, "Jack", 2000},
{3, "Joe", 1000}
};
Ranking *p = rank;
// printf("%d, %s, %d", p[0].num, p[0].name, p[0].score); // 单个元素输出
// printf("%d, %s, %d", p[1].num, p[1].name, p[1].score);
// printf("%d, %s, %d", p[2].num, p[2].name, p[2].score);
for (int i= 0; i < 2; i++) {
for (int j = 0; j < j - i; j++) {
if (p[j].score < p[j + 1].score) {
Ranking temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
for (int i = 0; i < 3; i ++) {
printf("%d, %s, %d\n", p[i].num, p[i].name, p[i].score);
}
return 0;
}
2. 预编译指令
1—普通宏 :
关键字(#define) 宏名(全大写 或者 k+驼峰) 值
例如:MAX kMax
关键字(#undef 结束处) 宏名(定义的宏名)
#define PI 3.1415926
int main() {
int a [5] = {12, 34, 12, 11, 89};
for (int i = 0; i < COUNT; i++) {
printf("%d", a[i]);
}
#pragma mark---------------预编译指令
double b = PI;
printf("%f\n", b);
// 宏定义结束
#undef PI
2—带参数的宏
#define SUM(a, b) a + b
int main(){
int a = SUM(2, 3);
printf("%d\n", a);
int c = SUM(2, 3) * SUM(4, 6);
// 结果:20 2 + 3 * 4 + 6 = 20 想让它等于50 加个括号就可以啦
}
所以在宏定义时,就最好加上括号
#define SUM(a, b) (a + b) // 避免出现扯淡的错误,防止受操作符优先级的影响
3—条件编译
// 第一种编译 如果定义了,执行a=10 否则执行a=100
#define INT
#ifdef INT
int a = 10;
#else
int a = 100;
#endif
// 第二种编译 如果没定义,执行代码1 否则执行代码2
#define PI
#ifndef PI
//代码1
#else
//代码2
#endif
// 第三种编译 如果非0,执行代码1 为0执行代码2
#if (2 + 3) // 常量表达式
//代码1
#else
//代码2
#endif