一维数组
一维数组的创建和初始化
创建
intarr[10];
创建数组时必须定义数组元素的类型以及数组的大小。
上述代码定义了可以存储10个int类型的数组。
数组创建时方括号中必须是常量,不能是变量。
例如下述代码
intmain()
{
intn=10;
intarr[n];
//error
return0;
}
这段代码中,n是变量不能用来创建数组,所以错误。
那有人问,用const修饰的变量可以视为常量,可以用来创建数组码?答案是不行,虽然用const修饰,但是它的本质啊还是变量,依然不能用来创建数组。
intmain()
{
constintn=10;
intarr[n];
//error
return0;
}
我在VS编译器上编译这段代码后报出以下错误:
其他长见的一些常量可以用来创建数组:
#define定义的常量
#defineMAX10
intmain()
{
intarr[MAX];
return0;
}
枚举类型定义的常量
enums
{
n=10
};
intmain()
{
intarr[n];
return0;
}
上述两种方式用来创建数组都是可以的。
初始化
在创建数组后可以对其进行初始化,也可以不用初始化,这取决于个人习惯。
#defineMAX10
intmain()
{
intarr1[MAX]={0,1};
intarr2[MAX]={0,1,2,3,4,5,6,7,8,9};
return0;
}
初始化可以进行局部初始化,例如arr1数组,也可以进行全部初始化,例如arr2。
局部初始化的数组arr1,除了前两个数之外,其他的默认为0。
没有进行初始化的数组,里面会放入随机内容。
一维数组在内存中的存储
数组在内存中是连续存放的。
我们可以创建一个数组,依次打印出数组中每个元素的地址。
#defineMAX10
#includestdio.h
intmain()
{
chararr[MAX];
inti=0;
for(i=0;iMAX;i++)
{
printf("%p\n",arr[i]);
}
return0;
}
定义了一个有10个char类型的数组,每个char类型在内存中占据1个字节,打印出每个元素的地址可以发现,彼此元素的地址之间相差1个字节,因此,数组的元素在内存中是连续存放的。
一维数组的访问
下标引用操作符访问
#defineMAX10
#includestdio.h
intmain()
{
intarr[MAX]={0,1,2,3,4,5,6,7,8,9};
inti=0;
for(i=0;iMAX;i++)
{
printf("%d",arr[i]);
}
return0;
}
数组的下标从0开始(也就是第一个元素的下标),依次往后+1。
上述代码就遍历了一遍数组,打印出了数组的元素,运行结果如图:
地址访问
数组名是首元素的地址,我们可以以下代码来证明
#defineMAX10
#includestdio.h
intmain()
{
chararr[MAX];
if(arr[0]==arr)
{
printf("arr[0]andarraresame\n");
}
else
{
printf("arr[0]andarrarenotsame\n");
}
}
运行结果如下
因此数组名表示数组首元素的地址。
那么如何通过地址来访问数组元素的?
#defineMAX10
#includestdio.h
intmain()
{
intarr[MAX]={0,1,2,3,4,5,6,7,8,9};
inti=0;
for(i=0;iMAX;i++)
{
printf("%d",*(arr+i));
}
}
数组名表示首元素的地址,而且数组元素在内存中又是连续存放的,所以让arr依次+1便可以得到数组每个元素的地址,再对地址进行解引用,就可以访问到这个元素。
运行结果如下