指针
1、指针是什么?
int *p; int a;
声明语句; 类型 变量;
int *p p是一个指针变量 指针是一个变量(特殊的变量:存地址的变量) 指针变量占用4个字节
数组
1、数组声明时,编译器要根据[ ]里面的数据去分配空间 int a[ ]; // 错误
2、[ ]里面是一个整数常量表达式
整型常量表达式: 1、表达式的值为整型 int (7.4 -3.4)
2、表达式中不能包含变量
3、int是元素的类型,而int[10]是数组类型 数组的声明需要什么?1.数据的个数 2.数据的类型 3.写法
int a;
a : 变量名
int : 变量的类型
4、对比
int a[10];
a 数组名
10 元素的数目,表示数组有 10 个元素
int 元素的类型,表示每个元素都是 int 类型数据
int a;
a : 变量名
int : 变量的类型
int *p;
p : 变量名
int * : 变量的类型
int a[10];
a: 变量名
int [10]: 变量的类型 (数组类型)
小结:在变量的声明语句中,除了变量名以外的,就是该变量的类型
在数组的声明中,除了 数组名[] 以外的,就是该数组的元素类型
练习: int a[3][4];
a 数组名
int [3][4] 数组的类型
使用类型去定义变量,那么分配的空间是连续的 数组的空间是连续的
5、数组的初始化
int a = 10;
思考:数组的初始化需要什么??
1.写多少个数据
2.数据区分
3.整体形式
数组的初始化,整体使用 {} 列表形式,每个数据使用 , 间隔
初始化列表中的数据个数 应该与 数组元素数目相同
int a[5] = {12, 34, 56, 78, 90};
①如果初始化列表中数据个数 小于 数组元素数目
int a[5] = {12, 34, 56};
概念:数组的部分初始化,未被赋值的元素会被置 0
理解:数组的初始化,首先将空间所有位清 0
char a[5] = {'h', 'l', 'l', 'u'};
字符数组部分初始化,会被置 '\0', 本质还是 0
0 '0' '\0'
0 : 整型数据 0
'0' : 字符0 --- 48
'\0' : 结束符 --- 0
②如果初始化列表中数据个数 大于 数组元素数目
int a[5] = {12, 34, 44, 8, 11, 23};
编译报错
数组的初始化还可以使用空的方括号 [],编译器会根据初始化列表中数据的个数
去分配空间
int a[] = {12, 33, 445, 56};//注意单单声明的时候不能写成这样int a[];
6、数组下标
int a[5] = {12, 34, 55, 68, 22};
int b[8];
int i;
for(i = 0; i < 5; i++)
{
printf("%d ", a[i]); // a[0] a[1] a[2] a[3] a[4]
}
如何访问数组的元素??
通过下标 (索引)
a[0] : 0 : 下标 表示数组a的第 1 个元素
a[3] : 表示数组a的第 4 个元素
理解:下标表示法,当做元素的变量名
a[0] : 数组a的首元素的数值
&a[0] : 数组a的首元素的首地址
下标是从 0 开始计数的
int a[5]; 元素数目,表示数组有 5 个元素
a[2] 下标 / 索引
表示数组的第 3 个元素
a[0] 表示数组的第 1 个元素
概念: 声明 和 初始化时,编译器需要根据方括号中数据去分配空间,因此此时,方括号中的数据表示数组元素的数目;
其余情况,均表示数组下标,这样我们可以去访问对应数组元素
int a[10];
a[6] = 10; // 将数据 10 赋给数组a的第 7 个元素
a[n] 表示数组的第 n+1 个元素
7、数组边界
使用下标,不要超过数组边界
int a[4] = {12, 45, 67, 78}; // 4 : 元素数目
printf(“a[4] = %d\n”, a[4]); // 4 :数组下标,数组的第5个元素
注意:
数组的下标是从 0 开始计数的
使用下标,不要超过数组的边界
8、指定数组大小
int a[10];
int a[];
1.数组定义时,[ ]里必须有数据
2.[ ] 里可以是一个整型常量表达式
3.表达式的值必须大于 0
整型常量表达式:
1.表达式里不能有变量
2.表达式的值为整型
理解:因为[]里面是表示元素的个数,必须为整型,必须大于 0
练习: 下面数组的声明,哪些是正确的????
int n = 4;
1) int a[]; // 错
2) int a[5-3.5]; // 错
3) int a{2}; // 错
4) int a[3*4-4]; // 对
5) int a[n-n+5]; // 错
6) int a[(int)4.56]; // 对
7) int a[5-6]; // 错
8) int a[2*3-6]; // 错
9) int a[6.5+2.3-3.8]; // 错
//1.用户输入年月日,求该天是这一年的第多少天??
// 如: 1998/3/4 是该年的第 63 天
#include <stdio.h>
int main()
{
int month[12] = {31,28,30,31,30,31,30,31,30,31,30,31};
int y = 0,m = 0,d = 0,days = 0,i = 0,sum = 0;
printf("请输入你要计算的年月日:");
scanf("%d %d %d",&y,&m,&d);
if(((y % 100 != 0)&&(y % 4 == 0))||((y % 400) ==0) )
{
month[2] = 29;
}
for(i = 0;i < m-1;i++)
{
sum += month[i];
}
days = sum + d;
printf("是该年的%d天\n",days);
}