这个系列的文章主要是讲一些C语言的语法中比较模糊的问题,和一些常用的语言技巧.
首先声明的是:对于C语言语法和语言技巧的讲解,我将以源码的形式给出,这些 都是C语言中比较基础,实用而且是重要的,当然对于C语言的老手,这些都是班门弄斧.但是我还是觉得,不管是新手还是老手,这些都是你提高语言能力有帮助的.
另外要说的是:文章开始的大部分是从一些精典的C语言书籍中提取的,但是不缺笔者的一些感想.我相信随着学习的深入会有更多精彩的东西.
推荐书籍:<<The C Programming Language>>,<<Pointers on C>>,<<Expert C Programming>>,<<C Traps and Pitfalls>>
文章以代码对照注释形式给出,还有运行结果对照.
/*=====================================
本程序是为了学习而使用的的测试程序,用来
说明C语言中的一些学习误区,对C语言的某些
知识作详细的讲解
=======================================*/
#include <stdio.h>
#include <stdlib.h>
void main()
{
/*================================================
主题:C语言中的多维数组
内容:C语言中定义和引用多维数组的维一方法就是使用数组
的数组(就是说数组的数组和多维数组在这里是同一个概念,
在pascal语言中不是这样),C语言中实际把数组当成一种向量
(vector),就是某种对象的一维数组(数组元素可以是一维数组
和其它).
==================================================*/
/*1.分解多维数组,多维数组中数组元素的定位*/
int data[2][3][4] ={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},{{13,14,15,16},
{17,18,19,20},{21,22,23,24}}};
printf("第1个测试值为:%d/n",data[1][2][3]); //测试中数组越界并没有报错
//p是指向一个二维数组的指针,这个地方要保证p后面的维数与data的后二维相同
int (*p)[3][4] = data;
printf("第2个测试值为:%d/n",p[1][2][3]);
//r是一个指向一维数组的指针,可以指向data中的第一个或第二个一维数组(把data的元素看成一个一维数组)
int (*r)[4] = data[1];
printf("第3个测试值为:%d/n",r[1][2]);
//t是一个int型的指针,让它指向data中的第三维的首元素(这个第三维是任意的)
int *t = data[0][0];
printf("第4个测试值为:%d/n",t[3]);
//上面的指针指向的数组维数不同增量差别会很大
printf("第5个测试值为:%x/n",r);
r++;
printf("第6个测试值为:%x/n",r);
printf("第7个测试值为:%x/n",t);
t++;
printf("第8个测试值为:%x/n",t);
/*2.多维数组的初使化*/
//上面已经提到一个多维数组初使化的例子,下面又是一个
int data1[][3] = {{1,2,3},{4,5}}; //维数大于初使值的个数则初使化为0
printf("第1个测试值为:%d/n",data1[1][2]);
/*3.初使化二维字符串数组*/
char fruit[][9] = {"apple", //方法一
"orange",
"ege",
"banana"};
printf("第1个测试值为:%s/n",fruit[1]);
char *anima[] = {"tiger", //方法二
"lion",
"chick",
"elephont"};
printf("第1个测试值为:%s/n",anima[1]);
}
以下是运行结果:
第1个测试值为:24
第2个测试值为:24
第3个测试值为:19
第4个测试值为:4
第5个测试值为: 12ff50
第6个测试值为: 12ff60
第7个测试值为: 12ff20
第8个测试值为: 12ff24
第1个测试值为:0
第1个测试值为: orange
第1个测试值为: lion