举个例子
#define N 10
int array [N]
为什么合法而
int k=10,a[k];
就不和法呢
k不是已经定义为整形常量了吗为什么还被认为是变量
int k=10 这是变量好吗,只是初始化了而已。
仔细看看变量和常量的定义先
C99标准中是允许的;C语言也有很多发行版本(C89, C95, C99, C11等)
C99标准中新增了一个功能:变长数组,这个数组的长度可以到运行时才决定,允许我们使用变量来定义数组的长度。(不过,一般不推荐使用)
问题解答:
变量初始化和宏定义的不同:
在C语言中,变量使用时必须先进行初始化,否则会出现未定义的错误,而宏定义则是定义一个常量或者简单的函数,它们的值是不会改变的,不需要进行初始化。
数组相关问题的解释:
数组在定义时,内存的分布是连续的,使用数组下标来引用每个元素,如果定义int k=10,此时k被定义并初始化为10,在a[k]中,k被使用在中括号[]中,表示取数组a的第k个元素,但是因为k被定义为int类型,在编译时k还没有确定具体的值,因此这句语句是非法的,编译器会说“使用了未定义的变量k”。
下面给出具体的解法:
参考代码如下:
#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;
}
参考代码如下:
#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;
}
如下是定义一个部分初始化的数组的例子:
int a[10] = {1,2,3,4,5};
在函数定义中,数组的形参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个整数值,链表按输入数据的逆序建立。
在这个题目中,可以用递归进行解题,下面给出参考代码:
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);
}
如下是绝对值的函数定义:
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