You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言函数中打印传入的二维矩阵变量名

解决C语言函数中打印传入二维矩阵变量名的问题

你遇到的问题根源在于宏的字符串化操作是在预处理阶段完成的,而函数的形参a是编译阶段的局部标识符。当你在saddle函数里调用VariableName(a)时,宏只会把当前作用域里的a转成字符串,完全和调用时传入的实参(比如A、B)无关——因为函数调用时,实参只是把矩阵的地址传递给形参a,两者的名字没有任何关联。

解决方案

要解决这个问题,需要在调用函数的阶段就把实参的变量名转成字符串,再传递给函数。可以通过一个包装宏来实现:

  1. 修改saddle函数,新增一个参数用于接收矩阵的名字字符串:
#include <stdio.h>

void saddle(int a[][100], const char* mat_name, int m, int n)
{
    printf("The saddle points of the matrix %s are: \n", mat_name);
    // 这里添加鞍点查找的业务逻辑
}
  1. 定义一个包装宏,在调用时自动把矩阵变量名转成字符串:
#define CALL_SADDLE(mat, rows, cols) saddle(mat, #mat, rows, cols)
  1. 调用时使用这个宏代替直接调用saddle函数:
int main()
{
    int A[3][100] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int B[2][100] = {{10, 20}, {30, 40}};

    CALL_SADDLE(A, 3, 3);
    CALL_SADDLE(B, 2, 2);

    return 0;
}

运行这段代码,会输出:

The saddle points of the matrix A are: 
The saddle points of the matrix B are: 

补充说明

  • 这个方法仅适用于直接传递变量名的场景,如果传入的是表达式(比如&arr[0]),#mat会把整个表达式转成字符串,而非变量名。
  • 宏的字符串化操作#var会直接把预处理阶段的标识符转成字符串,因此必须在调用点完成这个操作,才能获取到实参的名字。

内容的提问来源于stack exchange,提问作者insipidintegrator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:22:05