1)数组的定义:
/*
数组的定义: 1. 类型 数组名[]{常量或者常量表达式}
2.数组的命名规则要遵守标示符的命名规则
3.不能定义同名的数组名
4.数组可以宏定义
5.
*/
#include
int main(int argc, const char * argv[]) {
int len=4;
int arr[len]; 这样程序是不会报错的,因为系统给我们优化了,但在C++系统中是会报错的。
// #define M 5
// int arr[M]={};//这就是宏定义
// int x,y,arr2[5];//定义数组时可以定义其它变量。
int arr1[];
arr1={1,2};
// 1.数组和数组变量之间,不能赋值
// 例:int nums[5] = {1,2,3,4,5};
// int nums2[5] = nums; //报错的
//
// 2.数组名声明后也不能赋值
// int nums[5];
// nums = {1,2,3,4,5};
//
// 为什么会这样?
// 因为数组名是一个地址常量
//
// 不能通过数组名直接赋值
//
//
return 0;
}
2)数组的初始化:
#include
int main(int argc, const char * argv[]) {
int a[3]={1,2,4};//完全初始化
int a1 [3]={1};//部分初始化
// int len=4;
// int [len]={1,2,3,4}; 这样初始化数组是会报错滴
// int a2[10]={};
// for (int i=0; i<=9; i++) {
// printf("%d\n",a[i]);
// } 这样初始化数组,没有赋值,系统会自动的赋予垃圾值。
// int a3[10]={1,2};
// for (int i=0; i<=9; i++) {
// printf("%d\n",a3[i]);
// }这样初始化数组,部分初始化,剩下的数组的值,系统会默认为零
// int a4[10]={'a','b',};
// for (int i=0; i<=9; i++) {
// printf("%d\n",a4[i]);
// }字符型用%d打印输出是ASCII表的值。
int a4[10]={'a','b',};
for (int i=0; i<=9; i++) {
printf("%d\t",a4[i]);//用%d打印的话\0 就是0
} // 看结果是a,b,其实后面有许多的\0(不可见字符),0在系统中义字符串打印就是NULL(空自元)
return 0;
}
3)数组的越界及计算数组的长度:
#include
int main(int argc, const char * argv[]) {
int nums[2]={1,2};
nums[2]=9;//这是不安全的,因为这个空间不属于你的
//即使没有报错,但是这个数有可能会丢失
printf("%d %d %d\n",nums[0],nums[1],nums[2]);//没有写nums[2]=9,那么数组的越界是个垃圾值
// int arr1[9]={1,2,34,5,6,7,8,9,0};
//
// int len=sizeof(arr1)/sizeof(int);
// printf("%d",len);
//f=公式 sizeof(数组名)/sizeof(类型)
return 0;
}
4)数组作为函数的参数:
/*
数组的函数的参数
void test(int arr){
arr[0]=90;
}
数组是目前我们唯一学的类型里面,只有数组是共享空间的,也就是所谓的引用传递
*/
/*
//#include
//void test(int arr[]){
//
// arr[0]=90;
//}
//
//int main(int argc, const char * argv[]) {
// int a[5]={1,2,3,4,5};
// test(a);
// printf("%d\n",a[0]);// 90 数组名作为函数的参数,传递的是地址
// return 0; 实参是数组名a,形参是arr
//} 此时,a和 arr在内存中代表的是同一块内存空间
*/
/*
//#include
//int sum(int x,int y){
// return x+y;
//
// }
//int main(){
// int a[5]={1,2,3,4,5};
// int s= sum(a[0], a[4]);//值传递 把a[0]=1,a[4]=5传给sum中得x y
// printf("s=%d",s);
// return 0;
*/
/*
#include
void test(int num){
if (num>0) {
printf("你好\n");
}else
printf("你好吗\n");
}
int main(){
int a[5]={2,0,-1,-3,1};
for (int i=0; i<5; i++) {
test(a[i]);//数组元素实现值传递。
}
return 0;
}*/
#include
void test(int arr[]){//这里的形参是可以不写的,没有关系
for (int i=0; i<5; i++) {
printf("%d",arr[i]);
}
}
void test1(int arr[]){
int len=sizeof(arr);
printf("\nlen=%d\n",len);
}
int main(){
int a[5]={1,2,3,4,5};
float f1[5]={2.1f,3.2f,4.3f,5.3f,6.1f};
test(a); //正常写法
test(f1);//错误写法,因为实参的类型和形参的类型不一致,虽然不会报错,但运行的值是垃圾值。
int a1[10]={1,2,3,45,6,8,9,42,34,1};
test(a1);//可以的,长度虽然不一样,但是不会报错,但是运行结果和实际是不相符的
//关于数组名作为函数的参数后,数组的长度信息丢失的问题
int len=sizeof(a1);
printf("\nlen=%d\n",len);//40
//调用test1之后,再来看看len打印的值
test1(a1);//结果为8, 注意:C语言规定,不管你什么类型数据,数据的内存地址在内存中占用8个字节
}