int arr[10]={0};
*注意:创建数组时方括号里面的数表示元素的个数,只能用常量或者是define定义的
标识符表示,不能是变量;
b.数组的初始化:
*注意:数组使用时,方括号里的数都为数组的下标,而数组的下标是从0开始的,
所以,数组的第n个元素就用数组名[n-1]来表示。
指针变量是指一个指针类型的变量;
int *p=arr;
{
}
注意:只要通过一个指针变量拿到一个数组的首元素地址时,我们就可以通过这个指针拿到这个数组中的每一个元素;
指针的特点:
①指针类型决定了指针访问的权限
②指针类型不同结果不同
1.&(取地址符)后面直接跟数组名值得是整个数组,其值会和数组的首元素的地址的值一样,但是如果同时加1的话会直接跳过整组。
2、sizeof后面直接跟数组名指的是求整个数组的大小。
e.一维数组使用和定义中所要注意的问题
char arr1[]=”abc”;该数组中包含了a,b,c三个元素
char arr2[3]={‘a’,’b’,’c’};该数组包含了’a’ , ’b’ , ’c’ , ’\0’ 四个元素
a.二维数组的创建:
Int arr[3][5]
char arr[3][5]
double arr[3][5]
b. 数组的初始化:
Int arr[3][4]={1,2,3,4};
Int arr[3][4]={{1,2}{3,4}}
Int arr[][4]={{1,2}{3,4}}
注:行可以不写但是列一定要写。
c. 二维数组在内存中的存储:
1. 数组a的地址是ffc1,数组a[0]的地址也是ffc1,即a = a[0];
2.元素a[0][0]的地址是ffc1,所以数组a[0]的地址和元素a[0][0]的地址相同,即a[0] = &a[0][0];
3.最终可以得出结论:a = a[0] = &a[0][0],以此类推,可以得出a[1] = &a[1][0]
二位数组的数组名其实和一维数组是一样的,它也是一个指针,但不同的是,它指向的是二位数组的第一行的首地址,代表整个第一行,也就是说他是一个指向指针的指针。但是如果 & 操作符和 sizeof 后面紧跟着数组名的话,它指向的是整个数组。这一点与一维数组也是一样的。
例如:int arr[6][5]={ 0 }
首先我们知道,arr是一个二级指针,所以两次解引用后 **arr 就是数组的第一个元素arr[0][0] ,即**arr = arr[0][0] , 也就是 *arr=&arr[0][0] , 那么arr[0]值得是什么呢?我们可以这样想,arr[0]已经指出了数组的第一行,但未指出第几个元素,同一维数组 arr[0]=*(arr+0) ,因为arr是一个二级指针,所以我们可以知道*(arr+0)也是一个指针,而它指的就是二维数组第一行的首元素的地址,其就相当于一维数组的数组名所代表的意思。同理,我们可以推出arr指的就是第一行的地址,arr+1就是第二行的地址,以此类推。
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16 数组的大小
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(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 下一个数组的地址
printf("%d\n", sizeof(&arr[0]+1)); //4 第二个元素地址
printf("%d\n", strlen(arr)); //随机值x 执行需遇到"\0"结束
printf("%d\n", strlen(arr + 0)); //随机值x 执行需遇到"\0"结束
printf("%d\n", strlen(*arr)); //error 执行的"a"的ASCII
printf("%d\n", strlen(arr[1])); //error 执行的"b"的ASCII
printf("%d\n", strlen(&arr)); //随机值x 执行需遇到"\0"结束
printf("%d\n", strlen(&arr + 1)); //随机值x-6 执行需遇到"\0"结束
printf("%d\n", strlen(&arr[0] + 1)); //随机值x-1 执行需遇到"\0"结束
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //7 数组的大小,包括"\0"
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)); //error 执行的"a"的ASCII
printf("%d\n", strlen(arr[1])); //error 执行的"b"的ASCII
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 + 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)); //error 执行的"a"的ASCII
printf("%d\n", strlen(p[0])); //error 执行的"a"的ASCII
printf("%d\n", strlen(&p)); //随机值
printf("%d\n", strlen(&p+1)); //随机值
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(表达式) 内部表达式不计算。这里就表示一行元素