数组,那些你不知道的事儿

今天,我们带来的数组将不是你所了解的数组!

一、一维数组创建

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])


猜你喜欢

转载自blog.csdn.net/jochebed666/article/details/79917376