c语言数组自学,C语言自学《五》---- 数组

什么是数组

数组是一组数目固定、类型相同的数据项

数组中的数据称为元素

比如 long numbers[10];

方括号中的数字定义了要存放在数组中的元素个数,称为数组维度

数组有一个类型,它组合了元素的类型和数组中的元素个数,因此如果两个数组的元素个数、类型相同,这两个数组的类型就相同

可以在数组名称后的方括号内使用索引值,索引值是从0开始的连续整数,例如numbers[0]代表numbers数组的第1个元素

指定数组索引值

有两种方法指定数组索引值,以访问数组中的某个元素

第一种:使用一个简单的整数,明确指定要访问的元素,例如numbers[4]

第二种:使用计算表达式,计算的结果必须是整数,并且必须在数组中是有效的索引值,例如:numbers[i+3]

如果使用了一个无效的索引值,编译器不会检查出错误,但是执行时会有问题,有可能会提取一个垃圾值,也有比这更糟的,程序可能会覆盖重要的信息,且锁死计算机,需要重启计算机

使用数组

使用数组计算平均分:

int main(void) {

int grades[10];

unsigned int count = 10;

long sum = 0L;

float average = 0.0f;

printf("\nEnter the 10 grades:\n");

for(unsigned int i = 0; i < count; ++i) {

printf("%2u> ", i + 1); //提示用户输出10次

scanf("%d",&grades[i]); //遍历10次,每次为数组赋值,并求和

sum += grades[i];

}

average = (float)sum / count; //用求和数除以10次,求出平均数,保留小数点后2为

printf("\nAverage of the ten grades entered is: %.2f\n", average);

return 0;

}

寻址运算符&

寻址运算符&输出其操作数的内存地址,它广泛用于scanf()函数

把它放在变量名的前面,scanf()函数就可以利用这个变量的地址,将键盘输入的数据存入变量

只把变量放入函数的参数,函数就可以使用变量存储的值

而把寻址运算符&放在变量名称前面,函数就可以利用这个变量的地址修改这个变量中存储的值

代码示例:

#include

//以下代码的作用是输出一些变量的地址,和所占用的字节数

//得到什么地址值取决于所使用的操作系统及编译器分配内存的方式

int main(void) {

long a = 1L;

long b = 2L;

long c = 3L;

double d = 4.0;

double e = 5.0;

double f = 6.0;

//使用%u显示sizeof生成的值,因为sizeof()生成的结果是无符号的整数

//使用%p输出变量的地址,输出一个内存地址,其值为十六进制

//内存地址一般是32位或64位,地址的大小决定了可以用的最大内存量

printf("A variable of type long occupies %u bytes.", sizeof(long));

printf("\nHere are the addresses of some variables of type long:");

printf("\nThe address of a is: %p The address of b is: %p", &a, &b);

printf("\nThe address of c is: %p", &c);

printf("\n\nA variable of type double occupies %u bytes.", sizeof(double));

printf("\nThe address of d is: %p The address of e is: %p", &d, &e);

printf("\nThe address of f is: %p\n", &f);

return 0;

}

输出结果:

A variable of type long occupies 4 bytes.

Here are the addresses of some variables of type long:

The address of a is: 0012ff84 The address of b is: 0012ff80

The address of c is: 0012ff7c

A variable of type double occupies 8 bytes.

The address of d is: 0012ff70 The address of e is: 0012ff68

The address of f is: 0012ff60

数组的初始化

例如: double values[5] = {1.5,2.5,3.5,4.5,5.5};

这个语句声明了一个包含5个元素的数组value,values[0]的初值是1.5

初值的个数应该等于数组的维度,如果小于数组的维度,会自动初始化为0

也可以不提供维度,直接初始化数组,由编译器自动推断出元素的个数

确定数组的大小

使用sizeof运算符可以计算出指定类型的变量所占用的字节数

sizeof运算符生成size_t类型的值,该类型取决于实现代码,一般是无符号的整数类型

如果给输出使用%u说明符,编译器又把size_t定义为unsigned类型,编译器就可能发出警告

%u说明符不匹配printf()函数输出的值,所以使用%zu会消除该警告消息

sizeof运算符也可以用于数组,如下面的示例

代码示例:

double values[5] = {1.5,2.5,3.5,4.5,5.5};

//使用sizeof运算符输出上面数组所占的字节数

//sizeof运算符引用于变量时不需要使用括号,但一般还是使用括号

printf("The size of the array, values, is %zu bytes.\n", sizeof values); //8*5 = 40 bytes

//也可以用sizeof运算符计算数组中元素的数目

size_t element_count = sizeof(values) / sizeof(values[0]); // 40 / 8 = 5

//算出个数后,很方便应用于for循环遍历数组

for(unsigned int i = 0; i < element_count; ++i) {

printf("values[%u] = %.2lf\n", i,values[i]);

}

多维数组

多维数组可以看成是数组的数组,也可以按表格来理解

例如: float numbers[3][5]; 这二维数组维float类型,它拥有3行5列

行数的计算:二维数组总字节数 / 一行的总字节数 = 行数

列数的计算:一行的总字节数 / 某个元素的字节数(也就是某行中某列的元素的字节数)= 列数

代码示例:

int main(void) {

//初始化二维数组

int numbers[3][2] = {

{1,2},

{3,4},

{5,6}

};

//计算二维数组行数

size_t numbers_row = sizeof(numbers) / sizeof(numbers[0]);

size_t numbers_column = sizeof(numbers[0]) / sizeof(numbers[0][0]);

printf("numbers[0]=%zu\n",sizeof numbers[0]); //输出第一行的字节数

printf("numbers[0][0]=%zu\n", sizeof numbers[0][0]); //输出第第一行第一列的字节数

printf("row=%zu\n", numbers_row); //输出行数

printf("column=%zu\n", numbers_column); //输出列数

for(unsigned int i = 0; i < numbers_row; ++i) {

for(unsigned int j = 0; j < numbers_column; ++j){

printf("numbers[%u][%u] = %d\t", i,j,numbers[i][j]); //输出某行中的列

}

printf("\n"); //一行结束,换行

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值