数组和指针
重点:
数组的基本概念、定义及使用方法;
字符串的深入理解及相关字符串操作库函数;
指针的基本概念、定义与使用方法;
指针类型的参数和返回值;
指针与数组的关系;
指向指针的指针和指针数组;
一、数组
数组的基本概念:简单来说就是具有相同数据类型的若干变量的有序集合,是一种复合类型。数组count的元素的存储空间是相邻的,数组成员可以是基本数据类型,可以是复合数据类型。数组类型的长度应该用一个整数常量表达式来指定,而其中的元素通过下标来访问。
定义数组格式: 数据类型 数组名称[数组大小]={};
例:
定义和访问数组.
#include <stdio.h>
main()
{
int count[4]={1,2, },i;
for(i=0;i<4;i++)
{
printf("count[%d]=%d\n",i,count[i]);
}
}
这个例子通过循环把数组中额每一个元素依次访问一遍,在计算机术语中称为遍历。注意控制表达式i<4,如果写成i<=4就错了,因为count[4]是访问越界。
注意几点:数组不能相互赋值或初始化,不能用数组类型 作为函数的参数或返回值。数组类型做右值使用时,自动转换成指向数组首元素的指针。
二、数组应用实例
例:生成并打印随机数
#include "stdafx.h"
#include "stdlib.h"
#define N 20
int a[N];
void gen_random(int upper_bound)
{
int i;
for(i=0;i<N;i++)
{
a[i]=rand()%upper_bound;
}
}
void print_random()
{
int i;
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);
}
}
int main()
{
gen_random(10);
print_random();
getchar();
return 0;
}
这里介绍一种新的语法:用#define定义一个常量。实际上编译器的工作分为两个阶段,先是预处理阶段,然后才是编译阶段。注意,虽然include和define在预处理指示中有特殊含义,但它们并不是C语言的关键字,换句话说,它们也可以用作标识符。
三、多维数组
就像结构体可以嵌套一样,数组也可以嵌套,一个数组的元素可以是另外一个数组,这样就构成了多维数组。多维数组可分为整型数组、浮点数组和字符型数组等。
例:
int a[3][2]={1,2,3,4,5};
多维数组也可以像嵌套结构体一样用嵌套Initializer初始化。
例:
int a[][2]={{1,2},
{3,4},
{5,}};
注意,除了第一的长度可以由编译器自动计算而不需要指定,其余各维都必须明确指定长度。
例:多维字符数组
#include "stdafx.h"
void print_day(int day)
{
char days[8][10]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturay","Sunday"};
if(day<1||day>7)
{
printf("Illegal day number! \n");
return;
}
printf("%s\n",days[day]);
}
int main()
{
print_day(2);
getchar();
return 0;
}
这种方法称为数据驱动的编程,写代码最重要的是选择正确的数据结构来组织信息,设计控制流程和算法尚在其次,只要数据结构选择得正确,其他代码自然而然就变得容易理解和维护了。