1、数组的创建:
形如int arr [10] 即为一个数组
可表示为数组元素类型+数组名+[常量或常量表达式]
该数组类型为 int [10]。
数组名即为一个指针,此概念会在下文详细讲解。
2、数组的初始化:
创建数组时应养成将其第一时间初始化的习惯,否则新建的数组里均为随机值;
一维数组初始化
当创建一维数组时,若不进行初始化,则一定要指定数组大小
ex: int arr [10];
若进行初始化则可以省略制定数组大小
ex: int arr[10] ={1};
初始化数组时若 int arr[] ={x};则初始化数组中第一个元素为x,其余元素默认初始化为0.
明确初始化即将数组中每个元素初始化为制定值,此时不用指定数组大小
ex: int arr[] ={1,2,3,4,5}
当将字符串放进数组时,默认其字符串后有\0,若存放的是字符数组则不考虑。
ex: int arr1[] =”abc”这其中共有四个元素。
int arr2[] ={“a”,”b”,”c”}这其中有三个元素。
3、下标引用操作符[]
数组通过下标(从0开始)来访问。
4、数组中各元素的存储地址是连续的。
5、数组计算常用代码
计算数组大小: len= sizeof(arr)/sizeof(arr[0]);
查看数组中各元素地止: printf(“&arr[%d]=p%\n”,i,&arr[i]);
6、在数组中指针的应用:
int*p = arr;
则*(p+i)=arr[i]=p[i]
由1式知p指向arr的首元素地址,所以对p+i进行解引用便是对arr中第i个元素的地址进行解引用,即为p[i]。所以可知数组名在实际计算机执行程序的过程中可以视为指针.
1.除sizeof(单个数组名)以及“”&数组名“”中数组名表示整个数组,其余所有数组名均表示该数组的首元素地址。
2.数组地址与数组首元素地址指向的是相同位置,但其类型并不相同,为指针类型和数组指针类型所若对这两个指针进行+1,则分别代表指向整个数组后一位的地址与指向数组第二个元素地址。
7、二维数组
1.二维数组是线性的,即连续储存。
2.二维数组初始化时只可省略第一维的数组大小。
3.形如二维数组arr3[3][4]可理解为一个三行四列的数组,但在实际存储中由于内存是扁平的,所以可理解为在实际存储中arr3是一个由三个元素组成的一维数组,其中每个元素又是由四个元素组成的另外的一维数组;
即—> arr3[0][0]arr3[0][1]arr3[0][2] + arr3[1][0]arr3[1][1]arr3[1][2] + arr3[2][0]arr3[2][1]arr3[2][2][2]
4.二维数组arr3[3][4]的数组名arr3表示的是其三个元素数组中的首个数组arr3[0][i]的地址,若需找到arr3的首元素地址则应写为&arr3[0][0]或arr3[0].
8、数组的计算
sizeof()求的是变量或者空间开辟空间的大小,sizeof() 在进行传参时不进行计算值,即不考虑此变量的值是否为真,而仅仅需要的是这个变量的类型。而strlen()函数则求字符串长度,参数接收的必须是一个有效地址。
学习了这么多,来牛刀小试一下吧:
#include <stdio.h>
1.
int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(a)); //16 a中所有元素所占空间大小为4*4字节
printf("%d\n",sizeof(a+0)); //4 a中第一个元素所占空间大小
printf("%d\n",sizeof(*a)); //4 a中第一个元素所占空间大小(a解引用还是a)
printf("%d\n",sizeof(a+1)); //4 同2
printf("%d\n",sizeof(a[1])); //4 a第2个元素所占空间大小
printf("%d\n",sizeof(&a)); //4 整个数组地址还是一个地址,所有32位环境下的地址均为4
printf("%d\n",sizeof(&a+1)); //4 整个数组后一位地址
printf("%d\n",sizeof(&a[0])); //4第一个元素地址
printf("%d\n",sizeof(&a[0]+1)); //4第二个元素地址
return 0;
}
2.
#include <stdio.h>
int main ()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",strlen(arr)); // 随机数 数组中没/0,函数会一直查下去在随机地方遇到/0报值
printf("%d\n",strlen(arr+0)); // 随机数 从首元素开始向后找
//printf("%d\n",strlen(*arr)); //报错 首元素'a'的地址在ASCII中无法查询
//printf("%d\n",strlen(arr[1])); // 报错 同上
printf("%d\n",strlen(&arr)); //随机数 从数组地址即首元素地址开始向后找没/0,随机
printf("%d\n",strlen(&arr+1)); // 随机数-6 整个数组后开始找,依然随机
printf("%d\n",strlen(&arr[0]+1)); // 随机数-1 从数组第二元素开始查找
return 0;
}
3.
#include <stdio.h>
int main()
{
char *p="abcdef";
printf("%d\n",sizeof(p)); // 4 指针变量32环境下为4
printf("%d\n",sizeof(p+1)); //4 b的地址大小
printf("%d\n",sizeof(*p)); //1 a的大小
printf("%d\n",sizeof(p[0])); //1 a大小=arr[0]
printf("%d\n",sizeof(&p)); // 4 指针的地址大小依然为4
printf("%d\n",sizeof(&p+1)); // 4 指针后一位地址依然为地址
printf("%d\n",sizeof(&p[0]+1)); // 4 b地址
return 0;
}
4.
#include <stdio.h>
int main()
{
char *p="abcdef";
printf("%d\n",strlen(p)); // 6 p内存放首字符地址,从这里开始知道遇到/0结束
printf("%d\n",strlen(p+1)); //5 从第二个开始计算
printf("%d\n",strlen(*p)); // 报错 将a的ASCII值地址传进后,非法访问
printf("%d\n",strlen(p[0])); // 报错 将a的ASCII值地址传进后,非法访问
printf("%d\n",strlen(&p)); //随机数 从指针变量的地址开始找谁知道啥时候有/0
printf("%d\n",strlen(&p+1)); //随机数 从指针变量的地址的下一个地址开始找谁知道啥时候有/0
printf("%d\n",strlen(&p[0]+1)); //5 从第二个开始计算
return 0;
}
5.
#include <stdio.h>
int main()
{
int a[3][4]={0};
printf("%d\n",sizeof(a)); // 48 a中所有元素所占空间大小
printf("%d\n",sizeof(a[0][0])); //4 第一个元素所占空间大小
printf("%d\n",sizeof(a[0])); // 16 a[0][i]中元素所占空间大小
printf("%d\n",sizeof(a[0]+1)); //4 第二个元素地址
printf("%d\n",sizeof(a+1)); //4 a[1][i]地址所占空间大小
printf("%d\n",sizeof(&a[0]+1)); //4 a[1][i]地址所占空间大小
printf("%d\n",sizeof(*a)); // 16 a[0][i]中元素所占空间大小
printf("%d\n",sizeof(a[3])); //16 a[2][i]中元素所占空间大小
return 0;
}