字符数组
1.char ch[10]={"yhping"}; / /字符数组
ch[10],指定了这个char数组的长度是10
[y][h][p][i][n][g][\0][\0][\0][\0]
2.char ch2[10]={‘y’,'h','p','i','n','g'};
区别于char ch2[]={‘y’,'h','p','i','n','g'};
3.char *str="yhping"; / /字符型指针变量
对于字符数组,是将字符串放到为数组分配的存储空间去,而对于字符型指针变量,是先将字符串存放到内存,然后将存放字符串的内存起始地址送到指针变量str中。
整型数组
enum{M=10}
#define N 10
void main()
{
int ar[10]={1,2,3,4,5};/后面全补‘0’
定义:[ ]里必须存放 常量,整型,正整数,定义局部数组和全局数组时必须有值(在编译时能被确定的值)
int br[ ]={1,2,3,4,5}
const int n=10;
int cr[n];//编译通过
cr[N];//编译通过
cr[M];//编译通过
}
初始化:ar[5]={ };==>全为0
={1,2,3,4,5,}
={1,2,3,};==>1 2 3 0 0 括号中最后一个',’可有可无
={ , , ,1,2}==>错误
对于数组(在C14标准下)
int ar[-4]; //错误
br[14/3]; //正确
br[14/3.0]; //错误
br[ ]={ }; //错误
br[0]={9}; //错误
int ar[]={1,2,3,4,5,6,7,8,9,10};
sizeof(ar);//40
sizeof(ar[0])=4
sizeof(ar)/sizeof(ar[0])=数组元素个数
在sizeof 中ar代表整个数组,
所以 int *p=ar;//正确
int *p=&ar[0]//正确
void main()
{
int ar[]={12,23,34,45,56,67,78,89,90,100};
const int n=sizeof(ar)/sizeof(ar[0]);//const 定义的值必须初始化,而sizeof()在编译时就计算,n在编译时就产生确定的 //值,所以编译通过。
}
数组名的例外:
1.sizeof(ar);//在sizeof中ar代表整个数组的大小==>40
2.int *p[10] ----指针数组
数组,开辟10个空间,整型,存放整型变量的地址,也就是整型指针
sizeof(p)==40
int (*s)[10] ----数组指针
先看括号,是指针,指向一个数组,数组开辟10个空间,存放10个整型数据
sizeof(s)==4
int (*s)[10]=&ar;//数组的地址,代表整个数组
10不能缺省,也不能为其他数,在编译时检查数组的大小和ar一致
3.int (&br)[10]=ar;//引用数组,数组开辟10个空间(10不可或缺,在编译时检查数组的大小)
其他情况下都代表:首元素地址
int *p=ar;//(和情况2下的s比较,大小相同,意义不同)
区别上述*p和*s
s+1==>指向下一个数组,加40个字节
p+1==>指向下一个数据的地址,加4个字节
int (&br)[10]=ar;
int *p[10] ;
int (*s)[10];
sizeof(*s)==>s指向数组,*s代表整个数组==40
sizeof(*p)==>p指向ar[0],*p代表ar[0]本身==4
sizeof(s)==4
sizeof(p)==4
sizeof(br)==40 //br相当于ar的别名,即sizeof(ar)==40
数组正序输出:
for(int i=0;i<n;i++)
{
printtf("%d\n",a[i]);
}
倒序输出:
for(int i=n-1;i>=0;i--)
{
printtf("%d\n",a[i]);
}
for(int i=0;i<n;i++)
{
printf("%d %d %d\n",ar[i], *(ar+i), i[ar])
=>*(ar+1) *(ar+i) *(i+ar)
}
数组在函数形参中退化为指针
数组最大的缺陷:大开小用