A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wxh794708907 中级黑马   /  2015-7-20 16:42  /  580 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数组中的越界:如果写了这样一条代码:
char a[2]={'h','i'};那么它的下标范围就是 a[0]和a[1] 假如 它访问了a[2];因为本身a这个数组又没有a[2],那么此时另外一个数组的b的内存空间就被破坏了如图:
数组a          数组b
-----          -----
h | i          s | e
因为数组a分配了两个字节它有下标范围是a[0]和a[1] 如果它访问了 a[2]就会破坏数组b的内存空间 ,会发生未知的情况,这种情况就叫数组的越界;

程序应用:找最大值,从键盘输入10个数来找出最大值;
思路:1.通过循环依次输入10个数;
      2.保存到数组中;
      3.通过for循环遍历数组,
      4.找出最大值;
#include <stdio.h>
int main(){
int a[10];
int i;
   for (i=0;i<10;i++){
        printf("请输入第%d个数\n",i+1); //利用for循环让用户依次输入十个数;
        scanf("%d",&a);              //将用户输入的数存入到数组中;
   }
   int max = a[0];                     //这里定义的max不要放到for循环里面,
   for(i=1;i<10;i++){                  //放到for循环里面就会导致只能在for循环内才能 printf("max = %d\n",max)
        if(a>max) max = a;       //这样打印出来的就是每一个都会打印出来 因为在for循环内一直再循环;
    }
       printf("max = %d\n",max);
    return 0;
}

数组用作函数参数有两种形式:
一种是把数组元素(下标变量)作为实参使用;这是指的传递,只是把实参的值最后传递给了形参 是单向的传递;
第一个例子如下:
int sum(int x,int y){
return x+y;
}
#include <stdio.h>
int main(){
    int sum(int x,int y);
int a[5]={1,2,3,4,5};
int s;
    s = sum(a[0],a[4]);
    printf("%d",s);
    return 0;
}
上例里面的a[0]和 a[4]其实就是将它们在数组中的值传递给了函数sum

第二个例子在数组中假如一个数大于0就输出这个数 假如小于等于0就输出0 用函数实现;
void printSum(int x){
    if(x>0)
    printf("%d",x);
    else
    printf("0");
}
#include <stdio.h>
int main(){
    int a[5]={1,-2,-3,-4,5};
    int i;
    for (i=0;i<5;i++){
    printSum(a);
    }
    return 0;
}

一种是把数组名作为函数的形参和实参使用:这是地址的传递,指的是函数内的形参也是个数组,
                                        但是不会给它分配内存空间,它直接访问我们定义的数组;这是双向的传递,

例题如下 :在数组中有五个人的成绩 求他们的平均值 ,用函数来实现;
float avg(float av[5]){     //这里函数的参数是一个数组;
      float sum=0;
      int i;
      for(i = 0;i<5;i++){
        sum += av ; //实现数组中五个数的和;
      }
      return sum/5;
}
#include <stdio.h>
int main(){
    float avg(float av[5]); //声明函数;
    float a[5]={67.6,76.8,59.5,34.6,45.7};//定义一个数组以用来传递给函数avg
    float s = avg(a); //将a这个数组传递到函数avg中
    printf("%.2f",s);
    return 0;
}

数组名作为函数参数注意点:
1.形参数组的类型和长度要和实参一致;如果类型不一致结果就不会是我们的结果;
2.形参的数组的长度和实参的长度可以不一致,虽然不会报错,但是运行的结果和实际不相符;
3.形参数组的长度可以不写;
4.数组名作为函数参数时 它的长度会丢失 ,因为不管什么类型的数据,数据的内存地址在内存中占用8个字节;

冒泡排序的实现:输入一组无序的数,让他们排序 并输出;
#include <stdio.h>
void maoPao(int arr[],int len){      // int len的作用是为了将数组的长度定义出来
    int i;
    int j;
    int temp;
    for(i = 0;i<len-1;i++){          //外层for循环
      for(j = 0;j<len -1 -i;j++){       //内存for循环 实现数组中内容的对换;j<len -1-i的原因是 外层for循环进行了一次对比之后就会少一个比较
        if(arr[j]>arr[j+1]){
          temp =arr[j];              //着这一步往下三步都是实现位置的兑换;
          arr[j] =arr[j+1];
          arr[j+1] =temp;
        }
      }
    }
}

int main(){
    int f1[10]={34,455,555,666,6,7,77,88,887,6};  //这是定义了一个随机序列的数组;
    maoPao(f1,10);
    int i;
    for(i = 0;i<10;i++){
    printf("%d\t",f1);                         //按顺序来显示数组中的值;
    }
    return 0;
}

数组名作为函数参数注意点:
1.形参数组的类型和长度要和实参一致;如果类型不一致结果就不会是我们的结果;
2.形参的数组的长度和实参的长度可以不一致,虽然不会报错,但是运行的结果和实际不相符;
3.形参数组的长度可以不写;
4.数组名作为函数参数时 它的长度会丢失 ,因为不管什么类型的数据,数据的内存地址在内存中占用8个字节;

冒泡排序的实现:输入一组无序的数,让他们排序 并输出;
#include <stdio.h>
void maoPao(int arr[],int len){      // int len的作用是为了将数组的长度定义出来
    int i;
    int j;
    int temp;
    for(i = 0;i<len-1;i++){          //外层for循环
      for(j = 0;j<len -1 -i;j++){       //内存for循环 实现数组中内容的对换;j<len -1-i的原因是 外层for循环进行了一次对比之后就会少一个比较
        if(arr[j]>arr[j+1]){
          temp =arr[j];              //着这一步往下三步都是实现位置的兑换;
          arr[j] =arr[j+1];
          arr[j+1] =temp;
        }
      }
    }
}

int main(){
    int f1[10]={34,455,555,666,6,7,77,88,887,6};  //这是定义了一个随机序列的数组;
    maoPao(f1,10);
    int i;
    for(i = 0;i<10;i++){
    printf("%d\t",f1);                         //按顺序来显示数组中的值;
    }
    return 0;
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马