**十一:指针与结构体的完美搭配结构体遇上指针,简直是天作之合:#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student stu = {"小明", 18, 95.5};
struct Student *p = &stu;
// 两种访问方式,效果一样
printf("方式1 - (*p).name: %s\n", (*p).name); // 输出:小明
printf("方式2 - p->name: %s\n", p->name); // 输出:小明
// 修改数据也超简单
p->age = 19;
p->score = 98.0;
printf("修改后:%s今年%d岁,考了%.1f分\n", p->name, p->age, p->score);
return0;
}
用箭头操作符->,写起来简洁得不行!**十二:指针数组做函数跳转表这个**绝了,可以做个简易计算器:#include <stdio.h>
float add(float a, float b) { return a + b; }
float sub(float a, float b) { return a - b; }
float mul(float a, float b) { return a * b; }
float div(float a, float b) { return a / b; }
int main() {
float (*calc[])(float, float) = {add, sub, mul, div};
char ops[] = {'+', '-', '*', '/'};
float a = 10, b = 3;
printf("简易计算器演示:\n");
for(int i = 0; i < 4; i++) {
printf("%.1f %c %.1f = %.2f\n", a, ops[i], b, calc[i](a, b));
}
// 输出:
// 10.0 + 3.0 = 13.00
// 10.0 - 3.0 = 7.00
// 10.0 * 3.0 = 30.00
// 10.0 / 3.0 = 3.33
return0;
}
把函数装进数组,想调哪个调哪个,是不是很酷?**十三:const指针的三种姿势const和指针组合,有三种不同的**:#include <stdio.h>
int main() {
int a = 10, b = 20;
// 姿势1:指向常量的指针(指针可变,内容不可变)
constint *p1 = &a;
printf("p1指向:%d\n", *p1); // 输出:10
p1 = &b; // 可以改指向
printf("p1现在指向:%d\n", *p1); // 输出:20
// *p1 = 30; // 这句会报错!不能修改内容
// 姿势2:常量指针(指针不可变,内容可变)
int * const p2 = &a;
*p2 = 30; // 可以修改内容
printf("通过p2修改a:%d\n", a); // 输出:30
// p2 = &b; // 这句会报错!不能改指向
// 姿势3:指向常量的常量指针(都不能变)
constint * const p3 = &a;
printf("p3指向:%d\n", *p3); // 只能读取
// *p3 = 40; // 报错!
// p3 = &b; // 报错!
return0;
}
记住顺口溜:const在前内容定,const在后指针定,前后都有全都定!**十四:指针与malloc的黄金组合动态分配二维数组,这个操作太秀了:#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3, cols = 4;
// 分配指针数组
int **matrix = (int**)malloc(rows * sizeof(int*));
// 为每一行分配空间
for(int i = 0; i < rows; i++) {
matrix[i] = (int*)malloc(cols * sizeof(int));
}
// 填充数据
int count = 1;
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
matrix[i][j] = count++;
}
}
// 输出矩阵
printf("动态二维数组:\n");
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
printf("%2d ", matrix[i][j]);
}
printf("\n");
}
// 释放内存
for(int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
return0;
}
想要多大的二维数组就创建多大,用完就释放,内存管理变得超灵活!
|