8.2结构体与函数

 结构体:

        指向结构变量和结构数组的指针

                结构指针的计算以整个结构的大小为单位

        访问结构的成员

                通过结构变量访问其成员,用成员访问运算符“ . ”

                通过结构指针访问其目标的成员,用间接成员访问运算符 “ -> ”

        如果函数的参数是结构类型,那么形参只是实参的拷贝,在函数内部无法修改实参的成员

        如果函数的参数是结构指针,并接受实参的地址,那么就可以在函数内部修改实参的成员

//结构体和函数的关系:作为函数的形参和返回值
//切记:将来函数操作结构体,函数的形参一定是指针
#include <stdio.h>
//声明结构体
typedef struct student {
    char name[32];
    int age;
}stu_t;
void show(stu_t st) { //st=stu
    printf("%s, %d\n", st.name, st.age);
}
void grow(stu_t st) { //st=stu
    st.age++; //操作的是形参变量st.age成员,没有修改实参变量stu.age成员
}
void show_p(stu_t *pstu) { //pstu = &stu
    printf("%s, %d\n", pstu->name, pstu->age); 
}
void grow_p(stu_t *pstu) { //pstu=&stu
    pstu->age++; //通过pstu直接修改实参变量stu.age成员
}
stu_t get_student_info(void) {
    stu_t stu = {"小白", 17};
    return stu; //返回局部结构体变量stu的值
}
stu_t *get_student_info_p(void) {
    //stu_t stu = {"大瓜", 16};
    static stu_t stu = {"大瓜", 16};
    return &stu; //返回局部结构体变量stu的地址,不允许
}
int main(void) {
    stu_t stu = {"张少", 18};
    show(stu);//传递结构体变量stu的值给show函数
    grow(stu);//传递结构体变量stu的值给grow函数
    show(stu);//传递结构体变量stu的值给show函数
    show_p(&stu);//传递结构体变量stu的地址给show_p函数
    grow_p(&stu);//传递结构体变量stu的地址给grow_p函数
    show_p(&stu);//传递结构体变量stu的地址给show_p函数
    stu_t stu1 = get_student_info();//用stu1保存函数返回的结构体值
    printf("%s, %d\n", stu1.name, stu1.age);
    stu_t *pstu = get_student_info_p();//用pstu保存函数返回的地址
    printf("%s, %d\n", pstu->name, pstu->age);
    return 0;
}

        若定义的结构体指针函数中记录的数据用局部变量保存,则返回指针是局部变量,不允许,会报错,但若是返回静态变量则可以,这是生命周期的原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好,以下是一段用C语言实现矩阵求逆的函数代码: ``` #include <stdio.h> #include <stdlib.h> #define N 3 // 矩阵维度 // 定义矩阵A和A的逆矩阵 double A[N][N], A_inv[N][N]; // 定义函数获取矩阵的伴随矩阵 void adjoint(double mat[N][N], double adj[N][N]) { // 计算每一项的代数余子式 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { // 获取子矩阵 int sign = ((i + j) % 2 == 0) ? 1 : -1; // 符号判断 double tmp[N-1][N-1]; int ii = 0, jj = 0; for (int m = 0; m < N; m++) { if (m == i) continue; for (int n = 0; n < N; n++) { if (n == j) continue; tmp[ii][jj] = mat[m][n]; jj++; } ii++; jj = 0; } // 计算代数余子式 double cofactor = sign * (tmp[0][0] * tmp[1][1] - tmp[0][1] * tmp[1][0]); adj[j][i] = cofactor; } } } // 定义函数计算矩阵的行列式 double determinant(double mat[N][N]) { double det = 0.0; if (N == 1) { det = mat[0][0]; } else if (N == 2) { det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]; } else { int sign = 1; for (int i = 0; i < N; i++) { double tmp[N-1][N-1]; int ii = 0, jj = 0; for (int m = 0; m < N; m++) { if (m == 0) continue; for (int n = 0; n < N; n++) { if (n == i) continue; tmp[ii][jj] = mat[m][n]; jj++; } ii++; jj = 0; } det += sign * mat[0][i] * determinant(tmp); sign = -sign; } } return det; } // 定义函数计算矩阵的逆 int inverse(double mat[N][N], double inv[N][N]) { // 计算矩阵行列式 double det = determinant(mat); if (det == 0.0) { printf("无法求逆矩阵!\n"); return 0; } // 获取伴随矩阵 double adj[N][N]; adjoint(mat, adj); // 计算逆矩阵 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { inv[i][j] = adj[i][j] / det; } } return 1; } int main() { // 初始化输入矩阵A for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("请输入矩阵A[%d][%d]的值:", i+1, j+1); scanf("%lf", &A[i][j]); } } // 计算逆矩阵 inverse(A, A_inv); // 打印输入矩阵A和逆矩阵A_inv printf("矩阵A:\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%8.2f ", A[i][j]); } printf("\n"); } printf("矩阵A的逆:\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%8.2f ", A_inv[i][j]); } printf("\n"); } return 0; } ``` 这段程序通过定义一个矩阵结构体,实现了对矩阵求逆的操作。具体实现过程参见程序注释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值