关于数组不得不说的事(一维数组)

一、关于一维数组的创建和初始化

    所谓数组,就是由一组相同类型的元素组成的集合。其创建的格式为: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;
}
    运行结果为:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值