数组基本使用
假设现在有10个整数才在内存中,为了方便存取,可以使用数组,通过一个符号来访问多个元素
数组定义的格式:
#include <stdio.h>
void main(){
// 数组类型 变量名[数组长度];
int a[10]; // 定义了一个整型数组,变量名为 a;
// 错误声明(仅最新的c语言标准支持,最好不这么使用)
// int num;
// scanf("%d", &num);
// int a[num];
// 其他常见错误
// float arr[0] // 数组大小为0没有意义
// int arr1(2)(3) // 不能用小括号
}
初始化数组
#include <stdio.h>
void main(){
// 数组类型 变量名[数组长度];
int a[10]={1,2,3,4,5,6,7,8,9,10};
// 错误写法
// int a[10];
// a[10]={1,2,3,4,5,6,7,8,9,10};
}
初始化一部分值:
#include <stdio.h>
void main(){
// 数组类型 变量名[数组长度];
int a[10]={1,2,3,4}; // 表示只给前四个元素赋值,后6个元素值为0
// 如果全部是0,可以直接写成
int a1[10]={0};
// 或 int a1[10]={0,0,0,0,0,0,0,0,0,0} // 可以但不建议,显得low
}
数组的越界访问
如下面代码:
#include <stdio.h>
void main(){
int a[5]={1,2,3,4,5};
int j=20;
int i=10;
a[5]=6; // 越界访问
a[6]=7; // 越界访问
printf("i=%d\n",i); // 此处的i输出的值是 7
}
** 什么是越界访问?**
越界访问的危险性就是改变了其他变量的值。
在上述代码中,数组长度是5,int类型占4个字节,所有a一个占20个字节。
在c99标准中会编译不成功,控制台报错信息:
Signal: SIGABRT (signal SIGABRT)
Exception: EXC_BREAKPOINT (code=1, subcode=0x18a80e3ec)
数组的传递
#include <stdio.h>
// 错误写法
// 一维数组在传递时,长度是传递不过去的,这里的a取到的是实在数组的首地址
// void func(int a[5]){ // 变量a是指针类型,后续更新
// // sizeof(a)/sizeof(int)是数组长度
// for(int i=0; i<sizeof (a) / sizeof (int); i++){
// printf("%3d\n",a[i]); // 此时只能输出 1 2
// }
// }
//正确写法
// 通过length 把数组的长度传递过来
void func(int a[],int length){
for(int i=0; i<length; i++){
printf("%3d\n",a[i]); // 此时只能输出 1 2 3 4 5
}
}
void main(){
int a[5]={1,2,3,4,5};
// func(a);
func(a,sizeof(a)/sizeof(int));
}