数组名称不可以代表存储区
数组名称代表数组里第一个存储区的地址
/*
彩票练习
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int arr[7] = {0}, lottery[7] = {0}, num = 0, num1 = 0, cnt = 0;
srand(time(0));
/*for (num = 0;num <= 6;num++) {
arr[num] = rand() % 36 + 1;
}*/
do {
arr[cnt] = rand() % 36 + 1; //把新数字记录在所有有效数字的后面
for (num = 0;num <= cnt - 1;num++) {
//把新数字和前面已经得到的有效数字逐个对比
if (arr[cnt] == arr[num]) {
//新数字和某个以前的数字一样
break;
}
}
if (num == cnt) {
//新数字有效
cnt++;
}
} while (cnt < 7);
for (num = 0;num <= 6;num++) {
printf("%d ", arr[num]);
}
printf("\n");
for (num = 0;num <= 6;num++) {
printf("请输入一个数字:");
scanf("%d", &lottery[num]);
}
cnt = 0;
for (num = 0;num <= 6;num++) {
//每次循环处理计算机生成彩票中的一个数字
for (num1 = 0;num1 <= 6;num1++) {
//把用户输入彩票中的每个数字和计算机生成彩票中的某个数字依次对比
if (arr[num] == lottery[num1]) {
break;
}
}
if (num1 <= 6) {
//如果匹配上就把统计个数加一
cnt++;
}
}
printf("匹配上%d个数字\n", cnt);
return 0;
}
可以对数组名称进行sizeof计算,结果是整个数组包含的总字节个数
C99规范里允许声明数组时使用变量表示数组里的存储区个数,这种数组叫变长数组
如果程序多次运行则每次运行时数组里包含的存储区个数都可能不同
在一次运行过程中数组里包含的存储区个数不会改变
可以使用sizeof关键字计算变长中的总字节个数
变长数组不可以初始化
/*
身份证练习
*/
#include <stdio.h>
int main() {
int card[17] = {0};
int arr[] = {7, 9, 10, 5, 8, 4, 2, 1,
6, 3, 7, 9, 10, 5, 8, 4, 2};
char arr1[] = {'1', '0', 'X', '9', '8',
'7', '6', '5', '4', '3', '2'};
int num = 0, sum = 0;
for (num = 0;num <= 16;num++) {
printf("请输入一个数字:");
scanf("%d", &card[num]);
}
for (num = 0;num <= 16;num++) {
sum += arr[num] * card[num];
}
printf("最后一个数位的内容应该是%c\n", arr1[sum % 11]);
return 0;
}
多维数组除了可以表示多个存储区以外还可以表示这些存储区的分组情况
/*
数组名称演示
*/
#include <stdio.h>
int main() {
int arr[5] = {0};
printf("arr是%p\n", arr);
printf("&arr[0]是%p\n", &arr[0]);
printf("sizeof(arr)是%d\n", sizeof(arr));
return 0;
}
不能表示存储区分组情况的数组叫一维数组
/*
变长数组演示
*/
#include <stdio.h>
int main() {
int size = 0;
printf("请输入一个整数:");
scanf("%d", &size);
int arr[size]; //变长数组
printf("sizeof(arr)是%d\n", sizeof(arr));
return 0;
}
最常见的多维数组叫二维数组,它只能表示存储区的一次分组情况
声明二维数组的时候需要提供俩个整数,第一个整数表示分组个数,第二个整数表示每组里存储区个数
二维数组通常不会作为整体使用,一次只会使用其中的某个存储区
二维数组名称和两个下标就可以用来表示其中的某个存储区。第一个下标表示分组编号(组下标),第二个下标表示分组内存储区的编号(组内下标)
组下标范围从0开始到分组个数减一为止
组内下标范围从0开始到组内存储区个数减一为止
可以采用多重循环依次处理二维数组里的每个存储区
可以把二维数组当作一维数组进行初始化
也可以把初始化数据进行分组,每组初始化数据用来初始化一组存储区
如果可以根据初始化数据的个数计算出分组个数就可以省略二维数组声明中的分组个数
/*
变长数组练习
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int size = 0, cnt = 0, num = 0;
srand(time(0));
printf("请输入数字个数:");
scanf("%d", &size);
int arr[size];
do {
arr[cnt] = rand() % 36 + 1;
for (num = 0;num <= cnt - 1;num++) {
if (arr[num] == arr[cnt]) {
break;
}
}
if (num == cnt) {
cnt++;
}
} while (cnt < size);
for (num = 0;num <= size - 1;num++) {
printf("%d ", arr[num]);
}
printf("\n");
return 0;
}
二维数组名称也可以代表数组里第一个存储区的地址
二维数组名称不能代表存储区,所以不可以被赋值
可以对二维数组名称采用sizeof进行计算,结果是二维所包含的总字节个数
/*
二维数组演示
*/
#include <stdio.h>
int main() {
int arr[][2] = {{0, 1}, {2}, {4, 5}}; //二维数组声明
int row = 0, col = 0, tmp = 0;
/*for (row = 0;row <= 2;row++) {
for (col = 0;col <= 1;col++) {
arr[row][col] = tmp;
tmp++;
}
}*/
for (row = 0;row <= 2;row++) {
for (col = 0;col <= 1;col++) {
printf("%d ", arr[row][col]);
}
printf("\n");
}
return 0;
}
二维数组名称可以和一个下标配合使用,这个下标当作组下标看待。这个写法可以表示下标代表组中第一个存储区的地址。
/*
二维数组演示
*/
#include <stdio.h>
int main() {
int arr[3][2] = {0};
printf("arr是%p\n", arr);
printf("&arr[0][0]是%p\n", &arr[0][0]);
printf("sizeof(arr)是%d\n", sizeof(arr));
printf("arr[1]是%p\n", arr[1]);
printf("&arr[1][0]是%p\n", &arr[1][0]);
printf("sizeof(arr[1])是%d\n", sizeof(arr[1]));
return 0;
}
这个写法也可以当作一维数组看待,这个一维数组里包含下标代表组中所有存储区
/*
二维数组练习
*/
#include <stdio.h>
int main() {
int map[5][5] = {0};
int num = 0, num1 = 0, cur_row = 0, cur_col = 0, step_row = 0, step_col = 1, tmp_row = 0, tmp_col = 0;
for (num = 1;num <= 4;num++) {
for (num1 = 0;num1 <= 3;num1++) {
map[cur_row][cur_col] = num; //把当前位置填好数字
//计算移动一步后的位置
tmp_row = cur_row + step_row;
tmp_col = cur_col + step_col;
if (tmp_row < 0 || tmp_row > 4 ||
tmp_col < 0 || tmp_col > 4) {
//需要重新计算移动后的位置
if (step_row == 0 && step_col == 1) {
//向右改向下
step_row = 1;
step_col = 0;
}
else if (step_row == 1 && step_col == 0) {
//向下改向左
step_row = 0;
step_col = -1;
}
else if (step_row == 0 && step_col == -1) {
//向左改向上
step_row = -1;
step_col = 0;
}
else {
//向上改向右
step_row = 0;
step_col = 1;
}
tmp_row = cur_row + step_row;
tmp_col = cur_col + step_col;
}
//用计算出来的新位置替换原来的位置
cur_row = tmp_row;
cur_col = tmp_col;
}
}
for (num = 0;num <= 4;num++) {
for (num1 = 0;num1 <= 4;num1++) {
printf("%d", map[num][num1]);
}
printf("\n");
}
return 0;
}