数组可以存储一个固定大小的相同类型元素的集合;所有数组都是由连续的内存位置组成;最低的地址对应第一个元素;最高的地址对应最后一个元素。
一.声明数组
type arrayName [ arraySize ];
声明一个数组,需要指定元素的类型和元素的数量
二.初始化数组
可以逐个初始化数组,也可以使用一个初始化语句
三.初始化,定义例子
//初始化里面确定数组大小
int num[4] = {};
//在定义时明确指定数组的大小
int num[4] = {1,2,3,4};
//在定义时明确指定大小,并且初始化部分数据
//剩余的数据一般初始化为对应的数据类型的默认值
int num[4] = {1,2};
四.访问方式
-
数组单元个数可以使用 sizeof(数组名)/sizeof(数组内元素数据类型)
-
下标访问,
num[i]
-
指针访问,
*(num+i*4)
或者*(num+4)(编译器会自动处理)
-
数组的数组名表示的是:数组的首地址
-
(num+i*4)
表示访问num内第i个元素在内存里面的起始地址 -
*(num+i*4)
访问第i个元素的值
五.多维数组
声明:type name[size1][size2]...[sizeN];
二维数组
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:
type arrayName [ x ][ y ];
一个二维数组可以被认为是一个带有 x 行和 y >列的表格。下面是一个二维数组,包含 3 行和 4 列:
int x[3][4]初始化二维数组
多维数组可以通过在括号内为每行指定值来进行初始化
int a[3][4] = { {0, 1, 2, 3} , /* 初始化索引号为 0 的行 */ {4, 5, 6, 7} , /* 初始化索引号为 1 的行 */ {8, 9, 10, 11} /* 初始化索引号为 2 的行 */ };
内部嵌套的括号是可选的,下面的初始化与上面是等同的:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
六.传递数组给函数
对形参的改变会影响到实参,因为传递的是数组的首地址
三种方式声明一维数组形式参数:
- 形式参数是一个指针
void myFunction(int *param){
}
- 形式参数是一个已定义大小的数组
void myFunction(int param[10]){
}
- 形式参数是一个未定义大小的数组
void myFunction(int param[]){
//就函数而言,数组的长度是无关紧要的
//因为 C 不会对形式参数执行边界检查
}
七.从函数返回数组
-
C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。
-
如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数.
-
C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。
-
实际例子:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//计算机并不能产生真正的随机数
//而是已经编写好的一些无规则排列的数字存储在电脑里
//把这些数字划分为若干相等的N份
//并为每份加上一个编号用srand()函数获取这个编号
//然后rand()就按顺序获取这些数字,当srand()的参数值固定的时候
//rand()获得的数也是固定的,所以一般srand的参数用time(NULL)
//因为系统的时间一直在变
//所以rand()获得的数也就一直在变,相当于是随机数了。
/* 要生成和返回随机数的函数 */
int * getRandom( ){
static int r[10];
int i;
/* 设置种子 */
srand( (unsigned)time( NULL ) );
for ( i = 0; i < 10; ++i)
{
r[i] = rand();
printf( "r[%d] = %d\n", i, r[i]);
}
return r;
}
/* 要调用上面定义函数的主函数 */
int main (){
/* 一个指向整数的指针 */
int *p;
int i;
p = getRandom();
for ( i = 0; i < 10; i++ )
{
printf( "*(p + %d) : %d\n", i, *(p + i));
}
return 0;
}
网友评论