%p: 代表地址
数组名:代表数组的起始地址,它是常量
arr是数组常量,代表arr不能无条件的出现在数组左边。
[root@localhost CH01]# cat arr1.c
#include <stdio.h>
#include <stdlib.h>
#define M 3
int main()
{
int i,j;
static int arr[M] = {1,2,3};
printf("%d\n",sizeof(arr));
printf("arr = %p\n",arr);
arr = {4,5,6};
/*
for(i = 0; i < M; i++)
{
scanf("%d",&arr[i]); //scanf前后门不可加修饰符
}
*/
for(i = 0; i < M; i++)
{
printf("%p --> %d\n",&arr[i],arr[i]);
}
exit(0);
}
[root@localhost CH01]# make arr1
cc arr1.c -o arr1
arr1.c: In function ‘main’:
arr1.c:13:8: error: expected expression before ‘{’ token
arr = {4,5,6};
^
make: *** [arr1] Error 1
// 上面的错误代表错误发生在第13行,错误与前面的第8行相关
// 当前数组arr[M]={1,2,3} 在数组定义(第八行)时已经确定,arr的位置不会发生改变。因此第13行再次定义时会发生错误
数组元素的使用,用到了指针偏移的概念。
数组名是标识地址的常量,也是数组的起始位置
数组不会检查越界
[root@localhost CH01]# cat arr1.c
#include <stdio.h>
#include <stdlib.h>
#define M 3
int main()
{
int i,j;
static int arr[M] = {1,2,3};
printf("Before 赋值:%d\n",sizeof(arr));
printf("arr = %p\n",arr);
/*
for(i = 0; i < M; i++)
{
scanf("%d",&arr[i]); //scanf前后门不可加修饰符
}
*/
arr[3]= 10;
printf("a[3] = %d\n",arr[3]);
for(i = 0; i < sizeof(arr)/1; i++)
{
printf("%p --> %d\n",&arr[i],arr[i]);
}
printf("after 赋值:%d\n",sizeof(arr));
}
[root@localhost CH01]# ./arr1
Before 赋值:12
arr = 0x601034
a[3] = 10
0x601034 --> 1
0x601038 --> 2
0x60103c --> 3
0x601040 --> 10
0x601044 --> 0
0x601048 --> 0
0x60104c --> 0
0x601050 --> 0
0x601054 --> 0
0x601058 --> 0
0x60105c --> 0
0x601060 --> 0
after 赋值:12
由上例发现,arr[3]赋值前后,数组的大小都是12(3个元素,每个元素4byte),且arr[3]的起始地址,并不是arr[2]+4,即后面的赋值并没有添加到之前的数组中。
数组的定义由偏移地址。arr[3]赋值的空间不属于arr数组的空间
数组越界只能由程序员的经验去检查。
[root@localhost CH01]# cat fib.c
#include <stdio.h>
#include <stdlib.h>
#define M 10
int i,j;
static void fib(void)
{
int fib[M] = {1,1};
for(i=2;i<M;i++)
fib[i] = fib[i-1] + fib[i-2];
for(j=0;j<M;j++)
printf("fib[%d] = %d\n",j,fib[j]);
return;
}
int main()
{
fib();
exit(0);
}
[root@localhost CH01]# make fib
cc fib.c -o fib
[root@localhost CH01]# ./fib
fib[0] = 1
fib[1] = 1
fib[2] = 2
fib[3] = 3
fib[4] = 5
fib[5] = 8
fib[6] = 13
fib[7] = 21
fib[8] = 34
fib[9] = 55
列出fib数列的前10项,并在数组中逆序存放
[root@localhost CH01]# cat fib1.c
#include <stdio.h>
#include <stdlib.h>
#define M 10
int i,j,tmp;
static void fib(void)
{
int fib[M] = {1,1};
for(i=2;i<M;i++)
fib[i] = fib[i-1] + fib[i-2];
for(j=0;j<M;j++)
printf("fib[%d] = %d\t",j,fib[j]);
printf("\n");
i = 0;
j = sizeof(fib)/sizeof(fib[0]) - 1;
while(i<j)
{
tmp = fib[i];
fib[i] = fib[j];
fib[j] = tmp;
i++;
j--;
}
for(i=0;i<sizeof(fib)/sizeof(fib[0]);i++)
printf("fib[%d] = %d\t",i,fib[i]);
printf("\n");
return;
}
int main()
{
fib();
exit(0);
}
[root@localhost CH01]# make fib1
cc fib1.c -o fib1
[root@localhost CH01]# ./fib1
fib[0] = 1 fib[1] = 1 fib[2] = 2 fib[3] = 3 fib[4] = 5 fib[5] = 8 fib[6] = 13 fib[7] = 21 fib[8] = 34 fib[9] = 55
fib[0] = 55 fib[1] = 34 fib[2] = 21 fib[3] = 13 fib[4] = 8 fib[5] = 5 fib[6] = 3 fib[7] = 2 fib[8] = 1 fib[9] = 1