一维数组:
例:
int arr1[10] = {1,2,3}; (下标3~9全为零)
int arr2[] = {1,2,3,4}; (四个元素)
int arr3[5] = {1,2,3,4,5};
int arr4[3] = {'a',98,'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef"; (七个元素,还有\0)
数组创建,[ ]中必须为一个常量,不能使用变量。(可以进行宏定义,#difine NUM =10,则可以为arr[NUM])
数组不允许整体赋值:
int main()
{
int arr[10] = {0};
int i = 0;
for(;i<10;i++)
{
arr[i] = i;
}
return 0;
}
数组大小:
int arr[10];
int size = sizeof(arr)/sizeof(arr[0]);
数组在内存中是连续存放的;
所以其地址也是递增的;
1.内存中的每一个内存单元(字节)对应一个地址;
2.在32位的平台上指针的大小是4个字节,64位平台是8个字节。
(8个byte位是一个字节)
一维数组的指针访问:
数组的地址在数值上默认和数组首元素地址相等。
数组的数组名其实是数组首元素的地址,前提条件为,数组做右值,或者做运算符时;单独使用时,含义为整个数组。
(通过对数组名+整数的运算,可以得到数组每个元素的地址)
*(arr + 1) ----arr[1]
&arr[1]----arr+1
二维数组:
int arr[3][4];
把二维数组看做一维数组,不过里面的每一个元素都是一个数组!
二维数组是线性储存的!
arr[0][0] arr[0][1] arr[0][2] arr[1][0] arr[1][1] arr[1][2]……
二维数组的指针访问:
#include <stdio.h>
int main()
{
int arr[3][4] = {0};
int *p = &arr[0][0];
int i = 0;
for(;i<3*4;i++)
{
*(p+i) = i;
}
for(i=0;i<3;i++)
{
int j = 0;
for(;j<4;j++)
{
printf("%d“,arr[i][j]);
}
}
return 0;
}
数组的运算:
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
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
printf("%d\n",sizeof(&arr[0]+1)); 4