CDay03 数组

数组:保存多个相同类型数据的连续内存段。

元素:数组中保存的数据

声明一个数组本质上就是向操作系统内核申请一块内存。所以,必须告诉编译这块内存的大小(sizeof类型 * 元素个数),以及这段内存的名称(数组名)

类型名 数组名 [元素个数]

#if 0
	int a[5];//没有初始化数组,数组绑定的内存段中存储的数据为乱码
	//初始化:只有在定义变量的时候赋值才叫初始化。
	int a1[] = { 1,2,3 };
	int a2[6] = { 1 };//只要初始化的时候给一个元素赋值,编译器自动给没有赋值的元素赋值为0;

	//数组的使用
	//数组名[下标]
	//引用变量名就是访问变量名绑定的内存段
	//a[0] == *a 数组第一个元素绑定的内存段。
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
		/*如果声明数组的时候这样声明:int * a; sizeof(a) == 4
		但是如果声明数组的时候为:int a[5]; 虽然a为数组的首地址(int* const),但是sizeof(a)的时候编译器就
		变灵光了,它就是知道a表示的是一个数组,sizeof(a)为整个数组占据内存的大小(出自《C陷阱与缺陷》)*/
		printf("a[%d]:%d\n", i, a[i]);//读访问
		//sizeof 是一个关键字,获取表达式的类型的大小,可以去掉括号。
		for (int i = 0; i < 5; i++) {
			a[i] = i;//写访问
		}
	}
#endif
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

//定义一个数组,能够存储5个字符,要求用户输入10个数字字符,然后把它们转化为1个整数
//注意:输入的数据 从终端到内存 不是一步到位的,终端输入 1 和回车 ,编译器会把1和回车
	//放到输入缓存区里面去,然后第一次循环,scanf读走了1,回车留在输入缓存区,然后第二次
	//循环是scanf直接读走了留在缓冲区的回车。
	char nums[5];
	int n,i;
	for ( i = 0; i < 5;i++) {
		printf("请输入第%d个字符:", i+1);
		scanf("%c", &nums[i]);
		scanf("%*c");//读取输入缓存区中的回车,*为正则表达式中的统配符号,用来修饰c,把c修饰为任意字符。
	}
	printf("nums:");
	for (i = 0; i < 5; i++) {
		printf("%c",nums[i]);
	}
	printf("\n");
//	n = (nums[0] - '0') * 10000 + (nums[1] - '0') * 1000 + (nums[3] - '0') * 10 + (nums[3] - '0');

	printf("n:%d\n", n);
	return 0;
}

多维数组:

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

//多维数组
//一维数组:多个固定类型数据 
//二维数组: 元素类型为一位数组的数组
//三维数组:元素类型为二维数组的数组
//int a[3][5];//左边的[]指二维数组元素个数,右边的[]二维数组的元素(一维数组)的元素个数;
  int a[2][3]={
     {1,2,3},
     {6,8,9}
  };//二维数组右边的[]不可以不写,虽然你用大括号分隔了,但是编译器不理解,它仍然会像下面这样看待。
 //编译器不知道怎么分组,左边的[]可以不写。 
  int a1[2][3]={1,2,3,6,8,9};//这两种写法本质上面是一样的。
   //二维数组一般结合循环嵌套使用
   int map[8][8]={
     {1,2,3,1,2,3,1,1}, 
     {1,2,3,1,2,3,1,1}, 
     {1,2,3,1,2,3,1,1}, 
     {1,2,3,1,2,3,1,1}, 
     {1,2,3,1,2,3,1,1}, 
     {1,2,3,1,2,3,1,1}, 
     {1,2,3,1,2,3,1,1}, 
     {1,2,3,1,2,3,1,1}

   };
   int i,j;
   for(i=0;i<8;i++){//外层循环 对应二维数组的元素 
   	for(j=0;j<8;j++){//内层循环 对应二维数组元素(一维数组)的元素。 
   		printf("%d ",map[i][j]);
	   }
	   printf("\n");
   }
	return 0;
}

二维数组的本质是一维数组:

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

  int a[2][3]={
     {1,2,3},
     {6,8,9}
  };
  //二维数组的本质是一维数组,二维数组占用的仍然是一段连续的内存
  //数组的越界使用 
  printf("%d\n",a[0][3]);//? 6 因为 *(*(a+0)+3)== (*(a+1)+0) 
 
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值