C语言基础 -23 数组_ 一维数组之fabonacci数列

%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

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/106723799