数组中的越界:如果写了这样一条代码:
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;
}
|
|