首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

[C语言]初学者的一些理解-数组1

2013-09-06 
[C语言]菜鸟的一些理解-数组1本帖最后由 u011741688 于 2013-08-28 23:18:04 编辑数组的概念:数组的同一数

[C语言]菜鸟的一些理解-数组1
本帖最后由 u011741688 于 2013-08-28 23:18:04 编辑 数组的概念:数组的同一数据类型的许多数据元素按某种顺序排列在一起的集合,简单的来说  就是同一数据类型的集合。

为何需要数组:

假如我们要定义10个int型   int i,j,k,x,y,z,....  这样不是很麻烦,也不好管理。

一维数组:

一维数组是C语言中用来储存和处理一维序列数据的数据类型。组合使用数组名 和 数组下标[] 可以方便的访问数组的任意元素。

数组的定义:  数据类型  数组名[数组容量];
例1:
int array[5];//定义一个可以储存5个int型数据类型的数组

char c[2];//定义一个可以储存2个char型数据类型的数组

定义数值的需注意:数组容量必须是常量,这样编译器才可以成功为其分配内存。

数组的赋值:

1.int array[5] = {1,2,3,4,5};//其值要用逗号分开。

2.int array[5];//单独为其赋值。
array[0] = 1;
array[1] = 2;
.............
array[4] = 5;

3.int array[] = {1,2,3};//不为其定义数组容量,但是编译器会根据其元素的个数作为数组容量,当前有3个元素,那么该数组的容量是3。

4.int array[5] = {1,2,3};//只为数组的一部分赋值,剩余的编译器会初始化为零。

数组的访问:
通过下标访问数组中任意元素。

#include <stdio.h>

int main(void)
{
int array[5] = {1,2,3,4,5};
int i = 0;
for(i = 0;i < 5;++i)
printf("%d\t",array[i]);
printf("\n");
return 0;
}

注意:数组的下标是从0开始计算。
课后题:

1.将10个数:1,2,5,6,7,34,67,22,56,76存于数组中,求出这10个数的平均数。

#include<stdio.h>

int main(void)
{
int array[10] = {1,3,5,6,7,34,67,22,56,76};
int i = 0;
double m = 0;;
for(i = 0;i < 10;++i)
m = m + array[i];
m = m / 10.0;
printf("m = %lf\n",m);
return 0;
}

2.用数组实现输出fibonacci数列的前20项,fibonacci数列 1,1,2,3,5,8.......
#include <stdio.h>

int main(void)
{
int array[20] = {1,1};
int i = 0,f = 0;
for(i = 2;i < 20;++i)
array[i] = array[i-1] + array[i-2];
for(i = 0;i < 20;++i)
printf("%d\t",array[i]);
printf("\n");
return 0;
}


3.在数组中查找一个数 

#include <stdio.h>

int main(void)
{
int x = 0,i = 0;
int array[10] = {2,5,1,7,0,10,6,8,90,30};
for(i = 0;i < 10;++i)
printf("%d\t",array[i]);
printf("\n请输入你要查找的数:");
scanf("%d",&x);
for(i = 0;i < 10;++i)
{
if(x == array[i])
break;
}
if(i == 10)
printf("没有该数!!\n");
else
printf("查找成功!该数在第%d位!\n",i+1);


return 0;
}



4.从键盘输入10个数,将这10个数从小到到排列输出至屏幕。 

#include <stdio.h>

int main(void)
{
int i = 0,j = 0,t = 0;
int array[10] = {0};
for(i = 0;i < 10;++i)
{
printf("请输入[%d]:",i);
scanf("%d",&array[i]);
}
for(i = 0;i < 10;++i)
{
for(j = i + 1;j < 10;++j)
if(array[i] > array[j])
{
t = array[i];
array[i] = array[j];
array[j] = t;
}
}
for(i = 0;i < 10;++i)
printf("%d\t",array[i]);
printf("\n");
return 0;
}


注意:访问越界数组的危险

#include <stdio.h>

int main(void)
{
int i = 0;
int array[5] = {1,2,3,4,5};
for(i = 0;i < 5;++i)
printf("%d\t",array[i]);
printf("\n");
/****************************
越界访问 
 ****************************/
 for(i = 0;i < 7;++i)
printf("%d\t",array[i]);//会输出两个垃圾数字, 
printf("\n");
return 0;
}

为什么会有两的垃圾数字,而不是没有。
我的理解是:
电脑上的内存给别的程序用过,当该结束时候留下的垃圾。(简单来说就是以前有人住过,他搬家了没把垃圾带走,房东(系统)也不打扫。)

如果我没有理解到或理解错误的,请指出,在此万分感谢!!
c语言
[解决办法]
数组容量必须是常量
可以参考下新标准了!


访问越界是垃圾值,但是当你越界已经破坏了程序底层的栈空间的话
就会出内存空间访问出错了!

其实可以把指针也可以和数组一起讲讲!
马上看指针了,好好理解下指针,c语言的比较重要的一部分了
提示点:指针是指针,数组是数组,没有多大的关系!

[解决办法]
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

//在堆中开辟一个2×3×4×5的4维int数组
#include <stdio.h>
#include <malloc.h>
int ****p;
int h,i,j,k;
void main() {


    p=(int ****)malloc(2*sizeof(int ***));
    if (NULL==p) return;
    for (h=0;h<2;h++) {
        p[h]=(int ***)malloc(3*sizeof(int **));
        if (NULL==p[h]) return;
        for (i=0;i<3;i++) {
            p[h][i]=(int **)malloc(4*sizeof(int *));
            if (NULL==p[h][i]) return;
            for (j=0;j<4;j++) {
                p[h][i][j]=(int *)malloc(5*sizeof(int));
                if (NULL==p[h][i][j]) return;
            }
        }
    }
    for (h=0;h<2;h++) {
        for (i=0;i<3;i++) {
            for (j=0;j<4;j++) {
                for (k=0;k<5;k++) {
                    p[h][i][j][k]=h*60+i*20+j*5+k;
                }
            }
        }
    }
    for (h=0;h<2;h++) {
        for (i=0;i<3;i++) {
            for (j=0;j<4;j++) {
                for (k=0;k<5;k++) {
                    printf(" %3d",p[h][i][j][k]);
                }
                printf("\n");
            }
            printf("--------------------\n");


        }
        printf("=======================\n");
    }
    for (h=0;h<2;h++) {
        for (i=0;i<3;i++) {
            for (j=0;j<4;j++) {
                free(p[h][i][j]);
            }
            free(p[h][i]);
        }
        free(p[h]);
    }
    free(p);
}
//   0   1   2   3   4
//   5   6   7   8   9
//  10  11  12  13  14
//  15  16  17  18  19
//--------------------
//  20  21  22  23  24
//  25  26  27  28  29
//  30  31  32  33  34
//  35  36  37  38  39
//--------------------
//  40  41  42  43  44
//  45  46  47  48  49
//  50  51  52  53  54
//  55  56  57  58  59
//--------------------
//=======================
//  60  61  62  63  64
//  65  66  67  68  69
//  70  71  72  73  74
//  75  76  77  78  79
//--------------------
//  80  81  82  83  84
//  85  86  87  88  89
//  90  91  92  93  94
//  95  96  97  98  99
//--------------------
// 100 101 102 103 104
// 105 106 107 108 109
// 110 111 112 113 114
// 115 116 117 118 119
//--------------------
//=======================
//


------解决方案--------------------


栈里面内存,有过后是没有人打扫的。不像堆
[解决办法]


[解决办法]
引用:
Quote: 引用:

栈里面内存,有过后是没有人打扫的。不像堆


堆有人打扫吗?
calloc returns a pointer to space for an array of nobj objects, each of size size, or NULL if the request cannot be satisfied. The space is initialized to zero bytes.

堆上分配所需内存后,在提供给用户使用的时候,一般有个清零过程!可以认为,这是个打扫过程,按照linux内核黑客的说法:保证旧数据已被清除,保证核心的安全!
[解决办法]
除calloc外,都不一定清零!

热点排行