for(int i=0;i<3;i++) for(int j=0;j<4;j++) array[i][j]=rand(void);
赋值部分你可以自行处理,rand那个是个返回随机数的函数,不用管。这样就简单地实现了二维数组的赋值。
至于二维数组的初始化,可以用以下的方式进行。
第一种方式是都在你的控制内处理,就是规范数组大小,再给数组赋值,就是这样:
int array[3][4]={1 2 3 4 5 6 7 8 9 10 11 12};
这种方式比较中规中矩,当然,初始化表部分可以不用全部填满,只要小于13个就可以。 另外一种方式是比较随意的方式,就是依靠初始化列表来控制数组大小,但是只能控制行数,其中的列数必须声明,就是这样:
int array[][4]= {1 2 3 4 5 6 7 8 9 };
这样你就声明了一个列数为4,行数让编译器算的数组,这是一个3行4列的数组。这样的好处就是当你有一长串数字时,不用考虑太多,只要清楚每个数组单元存放几个元素就好,也就是说你只用管列数,行数不用考虑太多,用这种方式,让编译器帮你处理行数的初始化就好,而且不会造成整行的浪费。
在声明指向二维数组的指针时,需要注意的是声明时括号的使用,因为这里存在左结合和右结合以及优先级的问题。这里的声明方式是
int (*p)[N];//N为指向数组之列的大小
这里需要强调的是其声明方式中括号的使用,如果没有括号,也就是这样:
int *p[N];//同上;
那么这样生命的就是一个指针数组,一个存放N个指向int类型变量的数组。演示如下:
这里先把代码贴下来,不然后面文档格式不好处理。
#include
#include
#include
void put_out(int (*p)[4]); int main() {
int array[3][4]; int (*p)[4]; p=array; srand(time(0)); for(int i=0;i<3;i++)
for(int j=0;j<4;j++) array[i][j]=rand(); put_out(p); system(\}
void put_out(int (*p)[4]) {
for(int i=0;i<3;i++)
for(int j=0;j<4;j++) {
printf(\ if(j==3) putchar('\\n'); } }
为了方便你练习,我把代码贴在上面,你可以自己上机尝试一下。
代码很简单,就是随机赋值后输出。你可以发现,用数组指针的好处就是没有开辟新的内存单元,对吧?如若不然,在函数处理数组时是处理新开辟的内存单元,而不是main函数中我们想处理的那个二维数组,而且处理完的数组返回也是一个问题,而是用指向数组的指针就没有这样的问题,从而很轻松的实现了数组的模块化处理。当然,你也可以声明一个全局变量,就是在main函数外声明一个数组,但是我不喜欢这么做,因为没有技术含量,呵呵。
另外关于指针的加减法运算,在学校的时候曾经写了一个程序,效果也比较好。但是文件没有考过来,邮箱里也没有,所以我重新写了一个。需要强调的是指针有加减运算,但是不存在乘除运算,因为没有意义。后续会讲一下结构体和文件。这些内容在计算机二级考试中应该不会考的很深,而且以你的资质计算机根本二级不是事,我这么做无非锦上添花。所以我会在后续简单的介绍一下
相关内容,有兴趣可以上网查找相关内容,或把我贴的代码上机调试一下。计算机语言仅仅看书是远远不够的,需要实践。
指针加减的补充:
在这里我将使用常规的char类型数组和int类型数组进行演示,其中char的大小为1,int的大小为4。掩饰的效果图如下:
代码很简单,输出结果看得很清楚吧。int类型的指针在进行加法运算时,指针数值的变动以4为单位,因为int类型数据是4个字节大小。同理,char类型的指针在进行加减法运算时,加的单位是1,这里是因为char类型数据的大小为1,所以以1为加减的基础单位。现在理解了吧,就是这么回事。简言之,就是指针的加减运算的基本单位,是由指针的类型决定的。这里顺便把代码贴给你,可以自己调试一下:
#include
char char_array[10]=\ int int_array[10]={1,2,3,4,5,6,7,8,9},*int_p; char_p=char_array; int_p=int_array;
puts(\ int\ for(int i=0;i<10;i++) {
printf(\ printf(\
}
system(\
文件
在这里我就不细讲了,如果你想要打开一个文件,那么你需要一个指向文件的指针,而声明
这个指针的方式是用
FILE *fp//这里fp可以随便替换,只要不是关键字
下:
typedef struct _iobuf {
char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz;
char* _tmpfname; } FILE;
上面的typedef也是一个关键字,其作用是将struct _iobuf用FILE表示,这样声明后,只这里FILE全部为大写,在头文件的定义中,这个FILE其实是一个结构体,其包含内容图如
要使用FILE,就等于使用了struct _iobuf进行声明。
那么如果你要打开一个文件,除了拥有一个文件指针后,还需要一个能打开文件的函数,问
这个函数也再头文件中有,就是fopen(),很形象的一个名字,即fileopen。接下来用程序打开一个文件。首先,声明一个文件指针
FILE *fp;
然后我们使这个文件指向我们想要打开的文件,这里需要使用fopen函数
fp=fopen(\
这里我规定的文件名字是record.txt就是一个简单的文本文件。后面的”r”是fopen函数
的参数,其含义是读取,即read。下一步我们要从已指向record.txt的文件指针中获取其中的字符,这里可以使用一个fgetc函数,此函数的参数只是一个文件指针,所以可以把fp放进去就可以了。此时返回值是一个char类型的变量,可以用一个char变量去保存这个返回值。语句如下:
char c; c=fgetc(fp);
就是这么简单,这样你就获取了record文件中的第一个字母。需要注意的是,当你使用fgetc
函数后,再用fgetc函数从fp获取record的值时,获取的就是第二个字母,这个特性记住就好,不用深究。下面我们用一个简单的程序从一个已知的文件中读取其内容并在屏幕上输出:
代码我给你做了标注。这里读取的文件是该程序所在目录下的文件,也就是在同一个文件夹
中的文件,如果想要读取别的文件,就需要提供完整的地址,比如这个: