关于变量的初始化和宏定义的区别是什么以及数组的一些问题

举个例子
#define N 10
int array [N]
为什么合法而
int k=10,a[k];
就不和法呢
k不是已经定义为整形常量了吗为什么还被认为是变量

int k=10 这是变量好吗,只是初始化了而已。
仔细看看变量和常量的定义先

C99标准中是允许的;C语言也有很多发行版本(C89, C95, C99, C11等)
C99标准中新增了一个功能:变长数组,这个数组的长度可以到运行时才决定,允许我们使用变量来定义数组的长度。(不过,一般不推荐使用)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7583036
  • 以下回答来自chatgpt:

    问题解答:

    变量初始化和宏定义的不同:

    在C语言中,变量使用时必须先进行初始化,否则会出现未定义的错误,而宏定义则是定义一个常量或者简单的函数,它们的值是不会改变的,不需要进行初始化。

    数组相关问题的解释:

    数组在定义时,内存的分布是连续的,使用数组下标来引用每个元素,如果定义int k=10,此时k被定义并初始化为10,在a[k]中,k被使用在中括号[]中,表示取数组a的第k个元素,但是因为k被定义为int类型,在编译时k还没有确定具体的值,因此这句语句是非法的,编译器会说“使用了未定义的变量k”。

    下面给出具体的解法:

    1. 最大元素的寻找

    参考代码如下:

    #include<stdio.h>
    #define ROW 3
    #define COL 3
    int main()
     {
    
        int a[][3] = { 1,2,3,4,5,6,7,8,9 };
        int max = a[0][0];
        int maxRow = 0, maxCol = 0;
        for (int i = 0; i < ROW; i++)
        {
            for (int j = 0; j < COL; j++) {
                if (a[i][j] > max)
                {
                    max = a[i][j];
                    maxRow = i;
                    maxCol = j;
                }
            }
        }
        printf("max=%d maxRow=%d maxCol=%d", max, maxRow, maxCol);
    
    return 0;
    }
    
    1. 偶数奇数的求和

    参考代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    #define N 20
    int main()
    {
        int A[N];
        int i, count = 0, sumE = 0, sumO = 0;
    
        srand(time(NULL));
        for (i = 0; i<N; i++)
        {
            A[i] = rand() % 90 + 10;
            printf("第%d个数:%d\n", i + 1, A[i]);
        }
    
        for (i = 0; i < N; i++)
        {
            if (A[i] % 2 == 0) {
                count++;
                printf("第%d个偶数:%d\n", count, A[i]);
                sumE += A[i];
            }
        }
        count = 0;
        for (i = 0; i < N; i++)
        {
            if (A[i] % 2 != 0) {
                count++;
                printf("第%d个奇数:%d\n", count, A[i]);
                sumO += A[i];
            }
        }
        printf("所有偶数之和为:%d\n", sumE);
        printf("所有奇数之和为:%d\n", sumO);
        system("pause");
        return 0;
    }
    
    1. 部分初始化的数组

    如下是定义一个部分初始化的数组的例子:

    int a[10] = {1,2,3,4,5};
    
    1. 数组作为参数传递

    在函数定义中,数组的形参a实际上是一个指针,当进行参数传递时,主函数传递的是数组a的基地址,数组元素本身不被复制。作为一种表示习惯,编译器允许在作为参数声明的指针中使用数组方括号。

    如下是函数接口定义:

    struct ListNode *CreateList(int n); 
    struct ListNode *Del_AbsRepeat( struct ListNode **head ); 
    void Printlist(struct ListNode *head); 
    

    其中 n 和 head 都是用户传入的参数。 n 的值不超过 int 的范围,表示创建的链表结点数; head 是链表的头指针。输入时在第一行给出 L 的结点总数n。随后输入n个整数值,链表按输入数据的逆序建立。

    1. 递归

    在这个题目中,可以用递归进行解题,下面给出参考代码:

    int fn(int a, int n) {
        if (n == 0) return 0;
        else
            return 10 * fn(a, n - 1) + a;
    }
    int SumA(int a, int n) {
        if (n == 0) return 0;
        else
            return fn(a, n) + SumA(a, n - 1);
    }
    
    1. 输入输出格式化

    如下是绝对值的函数定义:

    double fabs(double x);
    

    其中,x 可为 double 和 float 类型,返回值是一个 double 类型的绝对值。

    参考代码如下:

    #include<stdio.h>
    #include<math.h>
    int main()
    {
        double x, y;
        scanf("%lf", &x);
        y = fabs(x);
        printf("%.2lf\n", y);
        return 0;
    }
    

    输入一个实数 x,输出该实数的绝对值,保留两位小数。

    输入样例:

    5.6789

    输出样例:

    5.68


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^