且不谈数据结构的逻辑问题,对于一些数据结构的简单代码的基本问题有时候是由于对C语言基础知识的拓展部分理解和掌握不够牢固,本人总结了一些小知识,觉得在以后的数据结构学习中可能会用的到,这次单拿数组来讲的,其他部分以后陆续补充,全篇是基于自己对《C Primer Plus 6th》英文版的理解,我个人觉得很难记住的要点进行的一些摘要和总结,后期如果还有的话我会继续补充。如果觉得不够全面,还请谅解。
一,变长数组(VLA)
比较简单的定义一个数组的时候总是要指明数组的大小,还需要赋初值,就好比这样:
int array[5]={
1,2,3,4,5};
后来比较高端一些的写法是这样的:
#define N 5
int array[N]={
1,2,3,4,5}
这类定义或许还可以解决一些简单的程序问题,但是当我们开始尝试解决一些比较难得题目的时候,这种定义似乎对于解决比较难得题目就显得力不从心,根据数组的定义来说,数组的长度在定义之后就不会改变,但是可变长数组又是怎么回事呢,《C Primer Plus》给出的说明是这样的:
当然,这本书是根据二维数组的例子来进行可变长数组讲解得
int quarters = 4;
int regions = 5;
double sales[regions][quarters]; // a VLA
可变长数组的一些限制条件:
1.可变长数组属于自动储存类别(不加static声明的局部变量)
也就是说,可变长数组要么是在函数内部声明的并且没有static或者extern之类的储存类型修饰符,要么是声明作为函数参数的
2.不能在函数声明中初始化可变长数组
3.可以用但有时候没必要(原话是: Finally, under C11, VLAs are an optional feature rather than a mandatory feature,
as they were under C99. )
NOTE,书中原话是这样的:
Note VLAs Do Not Change Size
The term variable in variable-length array does not mean that you can modify the length of thearray after you create it. Once created, a VLA keeps the same size. What the term variabledoes mean is that you can use a variable when specifying the array dimensions when first creating the array.
本人的理解是这样的:这里得可变长数组并不意味着你在声明它之后可以改变这个数组的大小,一旦它被定义了,这个数组的长度是不能变得,可变长数组的“变”在于你第一次定义这个数组的时候你可以用变量来用在代替数组的维度上
在声明具有二维可变长数组作为参数得函数时的固定格式:
int sum2d(int rows, int cols, int ar[rows][cols]); // ar a VLA
由于row 和 cols是作为数组 ar 的参数来被定义的,所以他们应该被定义在数组 ar 之前,而不能这么定义:
int sum2d(int ar[rows][cols], int rows, int cols); // invalid order
接着作者对可变长数组的用法通过一个例子做了详细的介绍:
//vararr2d.c -- functions using VLAs
#include <stdio.h>
#define ROWS 3
#define COLS 4
int sum2d(int rows, int cols, int ar[rows][cols]);
int main(void)
{
int i, j;
int rs = 3;
int cs = 10;
int junk[ROWS][COLS] = {
{
2,4,6,8},
{
3,5,7,9},
{
12,10,8,6}
};
int morejunk