一维数组的创建和初始化
数组的创建
数组是一组相同类型元素的集合。
数组的创建方式:
type_t arr_name [const_n]; //type_t是指数组的元素类型 //const_n是一个常量表达式,用来指定数组的大小 复制代码
注:数组创建,[]中要给一个常量才可以,不能使用变量。
数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。看代码:
int arr1[10]= {1,2,3}; int arr2[]= {1,2,3,4}; int arr3[5]= {1,2,3,4,5}; char arr4[3]= {'a',98,'c'}; char arr5[]= {'a','b','c'}; char arr6[]="abcdef"; 复制代码
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确 定。但是对于下面的代码要区分,内存中如何分配
char arr1[]="abc"; //数组中末尾存放了\0 char arr2[3]= {'a','b','c'}; //数组中末尾并没有存放\0 复制代码
一维数组的使用
对于数组的使用我们之前介绍了一个操作符:[],下标引用操作符。它其实就数组访问的操作符。
#include <stdio.h> int main() { int arr[10]= {0};//数组的不完全初始化 //计算数组的元素个数 int sz=sizeof(arr)/sizeof(arr[0]); //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以: int i=0;//做下标 for(i=0;i<10;i++) { arr[i]=i; } //输出数组的内容 for(i=0;i<10;++i) { printf("%d ",arr[i]); } return 0; } 复制代码
总结:
1.数组是使用下标来访问的,下标是从0开始。 2.数组的大小可以通过计算得到。 int arr[10]; int sz=sizeof(arr)/sizeof(arr[0]); 复制代码
一维数组在内存中的存储
int main() { int arr[10]= {0}; int i=0; for(i=0;i<sizeof(arr)/sizeof(arr[0]);++i) { printf("&arr[%d] = %p\n",i,&arr[i]); } return 0; } 复制代码
结论:数组在内存中是连续存放的。随着数组下标的增长,元素的地址,也在有规律的递增。由此可以得
关于数组中元素地址和栈中元素地址的区别
首先我们要知道局部变量是保存在栈区的,而在栈区开辟空间,是先使用高地址的空间,在使用低地址的空间,即先创建的变量在高地址处!
//验证 int main() { int a = 0; int b = 0; printf("&a = %p\n",&a); printf("&b = %p\n", &b); printf("&a - &b = %d\n", &a - &b); return 0; } 复制代码
那就有人要提出疑问了?上面数组的元素地址不是从低到高吗?那不是不符合吗?
解答:数组是一次性开辟一块空间,然后往后存放数据!
int main() { int arr[10] = { 0 }; printf("&arr = %p\n", &arr); printf("&arr + 1 = %p\n", &arr+1); return 0; } 复制代码
执行结果:
数组的地址+1跳过一块空间(空间的大小由数组所占的大小决定)
后序我们会提到:数组的地址 其实是数组指针-是指针,指针+1的步长取决于指针指向的类型所占的大小