一维数组:
创建:type_t arr_name [const_n] (元素类型 数组名 [常量])(注:[ ]中不能为变量。)
例如:int arr1[10]; char arr2[5]; float arr3[4]; double arr4[5];
初始化:在创建数组的同时给数组的内容一些合理的初始值。
例如:int arr1[5]={1,2,3,4,5}; char arr2[3]={'a','b','c'}; float arr3[3]={1.23,4.33,5.53}; int arr4[5]={3,2,1};(数组中 最后两个元素默认为0)
注:区别下面的两个代码;
char arr1[ ]="abc";
char arr2[3]={'a','b','c'};
前者内存分布为:‘a' 'b' 'c' '\0' 后者内存分布为 ‘a’'b' 'c' 。前者初始化为字符串时,结束标志‘\0'也会被赋值为 数组的内容。
使用:用下标引用符[ ]来访问数组.下标从0开始。
数组大小的计算方式:sz=sizeof(arr)/sizeof(arr[0]);
存储:数组在内存中是连续存放的。
指针访问:数组的数组名其实是数组首元素的地址。
#include <stdio.h>
int main()
{
int arr[]={1,2,3,4,5};
printf("%p\n",arr);
printf("%d\n",*arr);
return 0;
}
如上例:输出结果为:00EFFE84 (不唯一) 1 (首元素地址、首元素)
通过对数组名+整数的运算,可以获取到数组每个元素的地址。
如下例:第一个for循环初始化,第二个for循环输出。(p+i)指的是arr中的第i个元素的地址,则*(p+i)指的是数组arr中第i 个元素。
#include <stdio.h>
int main()
{
int arr[5]={0};
int i = 0;
int *p = arr;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);++i)
{
*(p+i) = i;
}
for(i=0;i<sizeof(arr)/sizeof(arr[0]);++i)
{
printf("%d\n",*(p+i));
}
return 0;
}
二维数组
创建:type_t arr_name [const_n][ const_n] (元素类型 数组名 [常量1][常量2])
(注:[ ]中不能为变量。常量1可以省略)
例如:int arr[3][4]; char arr2[2][5];
初始化:在创建数组的同时给数组的内容一些合理的初始值。
例如:int arr1[5][1]={1,2,3,4,5}; char arr2[3][3]={{'a','b','c'},{'d','e','f'},{'g','h','k'}};
int arr3[][3]=[{1,2},{3,4}};
数组arr3中元素为
1 2 0
3 4 0
使用:用下标引用符[ ]来访问数组.下标从[0][0]开始。
二维数组可以看成一维数组。
存储:同一维数组一样,在内存中都是连续存储的。
指针访问:数组的数组名其实是数组首元素(一维数组)的地址。
通过对数组名+整数的运算,可以获取到数组每个元素的地址。
设p是指向数组arr的指针变量。
若p=arr[0];p+i指向arr[0][i].
若p= &arr[0]+1;p+i指向arr[1]中的第i个元素。
例如:(sizeof求字节个数;strlen求字符串长度,遇到‘\0’为止)
#include <stdio.h>
int main()
{
int arr[3][4]={{0,1,2,3},{5,6,7,8},{9,10,11,12}};
int *p0 = &arr[0];
int *p1 = &arr[0]+1;
printf("%d\n",*(p0+1));
printf("%d\n",*(p1+1));
return 0;
}
结果分别为1 和6 。
数组的运算:
数组名代表整个数组的时候只有两种情况:
(1)sizeof(数组名),这里的数组名表示整个数组。(2)&数组名,这里的数组名表示整个数组。
一维数组
#include<stdio.h>
int main()
{
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(&a[0]+1)); //4
return 0;
}
字符数组
#include<stdio.h>
int main()
{
char a[] = {'a','b','c','d','e','f'};
printf("%d\n",sizeof(a)); //6
printf("%d\n",sizeof(a+0)); //4 (第一个元素的地址)
printf("%d\n",sizeof(*a)); //1 (第一个元素)
printf("%d\n",sizeof(a+1)); //4 (第二个元素的地址)
printf("%d\n",sizeof(a[1])); //1 (第二个元素)
printf("%d\n",sizeof(&a)); //4 (地址)
printf("%d\n",sizeof(*&a)); //6
printf("%d\n",sizeof(&a+1)); //4
printf("%d\n",sizeof(&a[0])); //4
printf("%d\n",sizeof(&a[0]+1)); //4
return 0;
}
#include<stdio.h>
int main()
{
char a[] = {'a','b','c','d','e','f'};
printf("%d\n",strlen(a)); //19
printf("%d\n",strlen(a+0)); //19
printf("%d\n",strlen(*a)); //错误
printf("%d\n",strlen(a+1)); //18
printf("%d\n",strlen(a[1])); //错误
printf("%d\n",strlen(&a)); //19
printf("%d\n",strlen(*&a)); //19
printf("%d\n",strlen(&a+1)); //随机值
printf("%d\n",strlen(&a[0])); //19
printf("%d\n",strlen(&a[0]+1)); //18
return 0;
}
#include<stdio.h>
int main()
{
char a[] = "abcdef";
printf("%d\n",strlen(a)); //6
printf("%d\n",strlen(a+0)); //6
printf("%d\n",strlen(*a)); //错误
printf("%d\n",strlen(a+1)); //错误
printf("%d\n",strlen(a[1])); //错误
printf("%d\n",strlen(&a)); //6
printf("%d\n",strlen(*&a)); //6
printf("%d\n",strlen(&a+1)); //随机值
printf("%d\n",strlen(&a[0])); //6
printf("%d\n",strlen(&a[0]+1)); //5
return 0;
}
#include<stdio.h>
int main()
{
char a[] = "abcdef";
printf("%d\n",sizeof(a)); //7
printf("%d\n",sizeof(a+0)); //4
printf("%d\n",sizeof(*a)); //1
printf("%d\n",sizeof(a+1)); //4
printf("%d\n",sizeof(a[1])); //1
printf("%d\n",sizeof(&a)); //4
printf("%d\n",sizeof(*&a)); //7
printf("%d\n",sizeof(&a+1)); //4
printf("%d\n",sizeof(&a[0])); //4
printf("%d\n",sizeof(&a[0]+1)); //4
return 0;
}
#include<stdio.h>
int main()
{
char *p = "abcdef";
printf("%d\n",sizeof(p)); //4 (a的地址)
printf("%d\n",sizeof(p+1)); //4 (b的地址)
printf("%d\n",sizeof(*p)); //1 (元素a)
printf("%d\n",sizeof(p[0])); //1 (元素b)
printf("%d\n",sizeof(&p)); //4 (指针p的地址)
printf("%d\n",sizeof(&p+1)); //4 (下一个指针地址)
printf("%d\n",sizeof(&p[0]+1)); //4 (b的地址)
return 0;
}
#include<stdio.h>
int main()
{
char *p = "abcdef";
printf("%d\n",strlen(p)); //6 (整个字符串)
printf("%d\n",strlen(p+1)); //5 (b之后的字符串)
printf("%d\n",strlen(*p)); //错误
printf("%d\n",strlen(p[0])); //错误
printf("%d\n",strlen(&p)); //随机值 (指针p的地址)
printf("%d\n",strlen(&p+1)); //随机值 (下一个指针地址)
printf("%d\n",strlen(&p[0]+1)); //4 (b之后的字符串)
return 0;
}
二维数组
#include<stdio.h>
int main()
{
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
return 0;
}