今天,我们带来的数组将不是你所了解的数组!
一、一维数组创建
1.不能出现a[ ];[ ]中要给一个常量才可以,不能使用变量。
2.可以出现a[ ]={0},即必须初始化。
二、一维数组初始化
1.数组在创建的时候如果想不指定数组的确定的大小就得初始化,数组的元素个数根据初始化的内容来确定。
2.区分char arr1[]="abc";char arr2[]={'a','b','c'};char*p="abcdef";
①以\0为结束标志,四个字符;②三个字符,无\0,不能当作字符串处理;③p指向字符串的首字母,一共七个字符。
三、一位数组的存储
1.数组在内存中是连续存放的,一个地址一个字节,隔四个一个地址。
2.32位的平台上指针的大小是4个字节,64位平台是8个字节。
四、数组指针
1.p=&arr[i]=arr+i
*(p+i)=arr[i]=*(arr+i)=*(i+p)=p[i]=i[p]=i[arr]
2.指针p和p+1的地址跳过多少地址取决于p的类型。
3.数组的数组名除了①sizeof(数组名)②&数组名这两种代表整个数组的情况,其余都表示数组首元素的地址。
五、二维数组跟一维数组的区别
1.创建和初始化时列不能省,行可以省。
2.二维数组按行存储,arr[i]可以看做数组名。
3.不能写成int *p=arr;因为int *被看做int (*)[4]。
六、有关数组的一些运算
//一维数组 字节数
int a[] = {1,2,3,4}; 16
printf("%d\n",sizeof(a)); 4
printf("%d\n",sizeof(a+0)); 4
printf("%d\n",sizeof(*a)); 4
printf("%d\n",sizeof(a+1)); 4
printf("%d\n",sizeof(a[1])); 4
printf("%d\n",sizeof(&a)); 4
printf("%d\n",sizeof(*&a)); 16
printf("%d\n",sizeof(&a+1)); 4(跳过了这个数组)
printf("%d\n",sizeof(&a[0])); 4
printf("%d\n",sizeof(&a[0]+1)); 4//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); 6
printf("%d\n", sizeof(arr+0)); 4
printf("%d\n", sizeof(*arr)); 1
printf("%d\n", sizeof(arr[1])); 1
printf("%d\n", sizeof(&arr)); 4
printf("%d\n", sizeof(&arr+1)); 4(数组元素f的后面,即跳过一个数组)
printf("%d\n", sizeof(&arr[0]+1)); 4(第二个元素的地址)
printf("%d\n", strlen(arr)); 随机值
printf("%d\n", strlen(arr+0)); 随机值
printf("%d\n", strlen(*arr)); 出错
printf("%d\n", strlen(arr[1])); 出错printf("%d\n", strlen(&arr)); 随机值
printf("%d\n", strlen(&arr+1)); 随机值
printf("%d\n", strlen(&arr[0]+1)); 随机值
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); 7
printf("%d\n", sizeof(arr+0)); 4
printf("%d\n", sizeof(*arr)); 1
printf("%d\n", sizeof(arr[1])); 1
printf("%d\n", sizeof(&arr)); 4
printf("%d\n", sizeof(&arr+1)); 4
printf("%d\n", sizeof(&arr[0]+1)); 4
printf("%d\n", strlen(arr)); 6
printf("%d\n", strlen(arr+0)); 6
printf("%d\n", strlen(*arr)); 出错
printf("%d\n", strlen(arr[1])); 出错
printf("%d\n", strlen(&arr)); 6
printf("%d\n", strlen(&arr+1)); 随机值
printf("%d\n", strlen(&arr[0]+1)); 5
char *p = "abcdef";
printf("%d\n", sizeof(p)); 4
printf("%d\n", sizeof(p+1)); 4
printf("%d\n", sizeof(*p)); 1
printf("%d\n", sizeof(p[0])); 1
printf("%d\n", sizeof(&p)); 4
printf("%d\n", sizeof(&p+1)); 4(跳过p的地址)
printf("%d\n", sizeof(&p[0]+1)); 4
printf("%d\n", strlen(p)); 6
printf("%d\n", strlen(p+1)); 5
printf("%d\n", strlen(*p)); 出错
printf("%d\n", strlen(p[0])); 出错
printf("%d\n", strlen(&p)); 随机值
printf("%d\n", strlen(&p+1)); 随机值
printf("%d\n", strlen(&p[0]+1)); 5
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); 48
printf("%d\n",sizeof(a[0][0])); 4
printf("%d\n",sizeof(a[0])); 16(相当于第一行数组名)
printf("%d\n",sizeof(a[0]+1)); 4(第一行第二个元素)
printf("%d\n",sizeof(a+1)); 4(第二行的地址,但值是第二行第一个元素的地址值)
printf("%d\n",sizeof(&a[0]+1)); 4(第二行的地址)
printf("%d\n",sizeof(*a)); 16(第一行)
printf("%d\n",sizeof(a[3])); 16(sizeof(类型)括号里不参与运算,所以a[3]相当于a[0])