一、关于一维数组的创建和初始化
所谓数组,就是由一组相同类型的元素组成的集合。其创建的格式为:type_t arr_name[const_n],其中type_t是数组元素的类型,const_n是一个常量表达式,用来指定数组的大小。
正确的一维数组创建实例:
int arr1[10];
char arr2[10];
float arr3[2];
double arr4[20];
int arr[2+2];
错误的一维数组创建实例:
int count = 10;
int arr5[count];
double arr[0];
前两句是因为在创建数组时,[ ]中要给一个常量表达式,不能够使用变量;后一句创建无意义。
数组的初始化要求在创建数组的同时给数组内容一些合理的初始值。
一些一维数组的初始化实例如下:
int arr1[10] = { 1, 2, 3 };
int arr2[] = { 1, 2, 3, 4 };//默认长度为4
int arr3[5] = { 1, 2, 3, 4, 5 };
char arr4[3] = { 'a', 98, 'c' };//98即'b'的ASCII值
char arr5[] = { 'a', 'b', 'c' };//与arr4是一致的
char arr6[] = "abcdef";//能够充当字符串,共有7个元素,有\0
char arr7[3] = "abc";//不会出错,在各编译器中都可以编译成功
关于一维数组的创建和初始化,还需了解其在内存中的分配情况。以下面三条代码为例进行讲解:
char arr1[] = "abc";
char arr2[3] = { 'a', 'b', 'c' };
char *p = "abcdef";
对于第一条语句,在内存中的储存形式为:'a''b''c''\0'。
对于第二条语句,在内存中的储存形式为:'a''b''c'。
对于第三条语句,在内存中的储存形式为:p-->"abcdef",其中,p内存储的是常量字符串"abcdef"的首元素'a'的地址。另外,常量字符串稳定性会被放入内存的只读区存储。
二、一维数组的使用
二、一维数组的使用
数组的访问使用下标进行,下标从0开始。一维数组的使用可以用一段代码展示:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int *p = arr1;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
system("pause");
return 0;
}
两个for循环都是用来输出一维数组的元素,其效果相同。程序运行结果为:
三、一维数组的存储
数组在内存中是连续存放的,这种存储形式可以利用一段代码看出:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr1[10] = {0};
int i = 0;
int sz = sizeof(arr1) / sizeof(arr1[0]);
for (i = 0; i < sz; i++)
{
printf("&arr[%d]=%p\n",i, &arr1[i]);
}
system("pause");
return 0;
}
程序用来依次输出数组arr1中各元素的地址,运行结果如下:
由运行结果可以看出,数组在内存中确实以连续形式储存。
四、一维数组的指针访问
其实在上述的”一维数组的使用“中已经涉及到了数组的指针访问。这里再作一些其他的声明。
数组的数组名其实就是首元素的地址。
有关数组名的三种使用情况:
1.&arr 此时是取的数组的地址,虽然在值上与数组的首元素地址相同,但意义不同(+1后有所体现)。
2.sizeof(arr) 数组名单独在sizeof中时,代表整个数组,所以此处是取整个数组的大小。
3.除此之外,数组名都代表数组首元素的地址。
请仔细揣摩下面代码:
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[] = {1,2,3,4};
printf("%p\n", arr);
printf("%d\n", *arr);
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));//首元素地址
printf("%d\n", sizeof(*arr));//首元素
printf("%d\n", sizeof(arr+1));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));//整个数组后的那个地址
printf("%d\n", sizeof(&arr[0]));
printf("%d\n", sizeof(&arr+1));//第二个元素
system("pause");
return 0;
}
运行结果为: