数组
1.格式
类型名(int[10])+变量名(arr):int arr[10]表示包含十个int类型元素的数组。
定义数组的时候,数组的大小就确定了
2.数组初始化
完全初始化:int arr[s]={1,2,3,4,5,};
数组没有制定大小,编译器默认后面的初始化是完全初始化
在数组中,有{}则初始化,另外上式中5后边的,不影响
s这个数规定数组大小,当然也可以不规定数组的大小,但需要写出所有元素。
几个初始化的例子:
char buf[]={“ABC”};
char buf[]=”ABC”;
int a[]={
1,2,3};
部分初始化:int arr_[5] = {
1, 2};
数组置零:int arr[5]={};
数组部分初始化:
int arr[5];
int arr_[5] = {
1, 2};
int arr_3[5] = {};
int arr_4[5] = {[2]=100};
数组元素是从下标为0开始的
注:数组越界,编译器不检查,提高效率(牺牲了安全性)
3.左值和右值
int arr[s]={1,2,3,4,5,};左值右值以等号=分开
左值代表的是内存空间,右值代表的是值(内存空间的内容)
arr++作为左值?这在c语言中是不被允许的
数组名不能为左值,数组名是元素的地址,是常量
即:1.数组名在程序运行开始就确定了常数地址
2.没有多字节的数可以赋值
右值:数组名可以作为右值,打印的是地址,数组首元素的首地址
arr,&arr,&arr[0]的值相同,即表达的内容相同。
arr元素的地址,&arr数组的地址
4.传值调用
&是取地址运算符,& a为变量a的地址
*是指针运算符,*p为指针变量,p所指向存储单元的内容,而指针变量p中一般只存放地址
& arr[0]取数组首元素的首地址
*arr 取数组的首地址
传值调用就是左值右值的传递
数组名作为参数时,丢了数组本身的大小,退化成了一个指针
数组名作为参数传递的是地址(数组首元素首地址)
数组名作为参数,要加上元素个数
数组的几道例题
1.冒泡排序
#include<stdio.h>
void main(void)
{
//冒泡排序
int arr[10];
//赋值
int i = 0, j = 0, temp = 0;
printf("请输入10个数,稍后我们将会按照冒泡排序进行排序:\n");
for (i=0; i<10; i++)
scanf("%d", arr+i);
// scanf("%d", &arr[i]);
//遍历
printf("---------------排序前-----------\n");
for (i=0; i<10; i++)
{
// printf("arr[%d] = %d.\n", i, arr[i]);
printf(" %d", arr[i]);
}
printf("\n"