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

xiaoxiao2021-02-28  90

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

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

转载请注明原文地址: https://www.6miu.com/read-78193.html

最新回复(0)