数组
一、一维数组的创建和初始化
1.数组的创建
数组是一组相同类型元素的集合。 int arr[10];
注:创建数组,[]中要给一个常量。
2.数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。
int arr1[10]={0};
int arr2[4]={1,2,3,4};
注:数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。
int arr[]={‘a’,’b’,’c’};
二、一维数组的使用
1.[] 数组访问操作符。
2.数组是使用下标来访问的,下标从0开始。
3.数组的大小可以通过计算得到。
int arr[10]={0};
int sz=sizeof(arr)/sizeof(arr[0]);
三、一维数组在内存中的存储
数组在内存中是连续存放的,且随着数组下标的增长,元素的地址也在有规律的递增。
四、指针的初步介绍
1.内存中的一个内存单元(字节)对应一个地址。
2.在32位的平台上指针的大小是4个字节,64位平台上是8个字节。
3.指针可以理解为一个变量,是一个专门用来存放地址的一个变量。
int num=10;
int *p=#//将num的地址存放到p指针变量中
五、一维数组的指针访问
例1:
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,0};
printf(“%p\n”,arr);//输出的是数组arr首元素的地址
printf(“%d\n”,*arr);//输出的是数组arr首元素的值 1
return 0;
}
例2:
int main()
{
int arr[10]={0};
int i=0;
//int* p=&arr[0];
int* p=arr;//数组名是数组首元素的地址
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
*(p+i)=i;//用指针对数组中的元素进行0-9的初始化
printf(“%d\n”,*(p+i));
}
retutn 0;
}
六、二维数组的创建和初始化
1.二维数组的创建:int arr[3][4];
2.二维数组的初始化:int arr[3][4]={1,2,3,4}
七、二维数组的使用
例:int main()
{
int arr[3][4]={0};
int i=0;
int y=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
arr[i][j]=4*i+j+1;//对数组进行0-12的初始化
printf(“%d”,arr[i][j]);
}
}
return 0;
}
八、二维数组在内存中存储
例:int main()
{
int arr[3][4]={0};
int i=0;
int j=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf(“&arr[][]=%p\n”,i,j,&arr[i][j]);
}
}
return 0;
}
结论:二维数组在内存中也是连续存放的,所以二维数组的行可省
略而列不可以省略。
九、二维数组的指针访问
二维数组数组名当作首元素的地址时,代表的是第一行这样一个一维数组的地址。
int *p=&arr[0][0];//指针变量p中存放的是数组下标为(0,0)的首元素的地址
arr[i]==*(arr+i)==*(i+arr)==i[arr]
十、有关数组的运算
//一维数组
int a[]={1,2,3,4};//int 4个字节
printf(“%d\n”,sizeof(a));//sizeof(a),a表示整个数组4*4=16
printf(“%d\n”,sizeof(a+0));/*a+0表示首元素的地址(4个字节)4 */
printf(“%d\n”,sizeof(*a));//*a表示首元素的地址 4
printf(“%d\n”,sizeof(a+1));/*(a+1)表示下标为1的元素的地址 4 */
printf(“%d\n”,sizeof(a[1]));//同上 4
printf(“%d\n”,sizeof(&a));//&a取出的是地址,地址4个字节
printf(“%d\n”,sizeof(&a+1));/*&a取出的是数组的地址,&a+1取出的是整个地址之后的地址,即&a+1跳过了整个数组*/
printf(“%d\n”,sizeof(&a[0]));//&a[0]表示a[0]的地址 4
printf(“%d\n”,sizeof(&a[0]+1));&a[0]+1表示a[1]的地址 4
//字符数组
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };/*char(1个字节)*/
printf("%d\n", sizeof(arr));/*6 此处arr表整个数组大小*/
printf("%d\n", sizeof(arr + 0));/*4 arr+i表下标为i的元素的地址(4个字节)*/
printf("%d\n", sizeof(*arr));/*1 arr不单独放时表首元素地址,*arr表首元素的值*/
printf("%d\n", sizeof(arr[1]));//1 下标为1的元素的值
printf("%d\n", sizeof(&arr));//4 &arr表数组的地址
printf("%d\n", sizeof(&arr + 1));/*4 &arr+1表整个数组后面的地址*/
printf("%d\n", sizeof(arr[0] + 1));/*4 下标为1的地址/*
printf("%d\n", strlen(arr));/*随机值 不知道'\0'在何处*/
printf("%d\n", strlen(arr + 0));//随机值 同上
printf("%d\n", strlen(*arr));/*错误代码 *arr表数组首元素的值,strlen(*arr)表将'a'的ASC码值传给strlen,发生错误*/
printf("%d\n", strlen(arr[1]));//同上
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr + 1));/*随机值 但比上小6(调过了整个数组)*/
printf("%d\n", strlen(arr[0] + 1));/*随机值 但比上上小5(从第二个元素开始跳过了数组)*/
char *p = "abcdef";
printf("%d\n", sizeof(p));/*4 p为指针变量,且指向a的地址*/
printf("%d\n", sizeof(p+1));//4 p+1指向b的地址
printf("%d\n", sizeof(*p));//1 *p表首元素的值
printf("%d\n", sizeof(p[0]));//1 同上
printf("%d\n", sizeof(&p));//4 &p表p的地址
printf("%d\n", sizeof(&p+1));/*4 &p+1取出的是p后面的地址*/
printf("%d\n", sizeof(&p[0]+1));/*4 &p[0]表首元素a的地址,&p[0]+1表b的地址*/
printf("%d\n", strlen(p));//6=6*1
printf("%d\n", strlen(p+1));/*5 p为字符指针,p+1向后跳一个字节*/
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 从b开始往后数
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));/*7 arr单独放在sizeof内,表整个数组*/
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 下标为1的元素的地址*/
printf("%d\n", sizeof(*&arr));/*7 &arr表整个数组的地址,*&arr表整个数组的大小*/
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 从第二个元素开始往后数 */
//二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//3*4*4=48
printf("%d\n", sizeof(a[0][0]));//4
printf("%d\n", sizeof(a[0]));//4*4=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
总结:
数组名代表整个数组的时候只有两种情况:
1.sizeof(数组名),这里的数组名表示整个数组。
2.&数组名,这里的数组名表示整个数组。