【导语】“只想做个废柴”通过精心收集,向本站投稿了6篇对于c/c++中的数组排序及计算平均值和得到最大最小值的思考,下面是小编整理后的对于c/c++中的数组排序及计算平均值和得到最大最小值的思考,欢迎您能喜欢,也请多多分享。
- 目录
篇1:对于c/c++中的数组排序及计算平均值和得到最大最小值的思考
最近在帮助其它人的学习中发现了许多问题就数组和局部变量和全居变量的两道例题进行刨析和思考!
排序操作
#include
voidsort(array,n)
intarray[];
intn;
{
inti,j,k,t;
for(i=0;i)/* 循环9次,这里循环9次因为排列到第9次的时候最大的已经自动被排列到最后了 */
{
k=i;[/LIGHT] /* 把i记录下来,以便进行调换操作 */
for(j=i+1;)j/* 在外部i循环内进行第二次循环,检查所有的剩余元素 */
{
if(array[j])/* 利用k对比j循环的元素大小是否比外部i循环当前元素的值 */
{
k=j; /* 将k的值定义为j循环的最小元素的(下标),以便进行调换操作 */
}
t=array[k]; /* 将t的值定义为j循环的最小值元素的值 */
array[k]=array[i]; /* 把j循环内的(也就是array[j])的值,调换为此次外部i循环元素的值 */
array[i]=t; /* 将外部i循环的当前元素的值替换为前面以t为临时存储的(也就是array[j])的值 */
}
}
}
main
{
inta[10],i; /* 定义a[10]为一个数组,用于输入10个不同的数字;定义用于循环的便量i; */
printf(“enter the array\\n”);
for(i=0;i<10;i++)
{
scanf(“%d”,&a[i]); /* 利用这10次循环给每个数组元素尽心赋值操作从a[0]到a[9] */
}
sort(a,10);/* 把数组a的各数组元素地址和数组数量传递给自定义排序涵数的形式参数 */
printf(“the sorted array:\\n”);
for(i=0;i<10;i++)
{
printf(“%d”,a[i]); /*利用10次循环把排序后的数组元素打印在屏幕上*/
}
printf(“\\n”);
}/* 此篇代码练习序号注意的是用数组名作涵数实际参数的时候,不是把数组的值传递给形式参数,
而是把实际参数数组的起始地址传递给形式参数数组,这样两个数组就共同占用一段内存单元,而
不需要建立两个不同的数组浪费内存空间 */
求平均值和找最大最小值
#include
floatmax; /* 定义全局变量max用于存储最大的数 */
floatmin; /* 定义全居变量min用于存储最小的数 */
main()
{
floatcount_avg(); /* 声明自定义涵数的数据类型 */
floatscore[10]; /* 定义一个数组用于存储输入数字 */
floatscore_avg;
inti; /* 定义用于循环的变量i */
for(i=0;i<10;i++) /* 利用一个为10次的循环为score[0]-score[9]的数组元素输入值*/
{
scanf(“%f”,&score); /* 格式化输入 */
}
score_avg =count_avg (score,10); /* 调用count_avg涵数计算平均值,在实际参数中带如数组score的地址和数组元素个数 */
printf(“avg=%6.2f max=%6.2f min=%6.2f”,score_avg,max,min); /* 将平均值,最大值,最小值打印在屏幕上 */
}
floatcount_avg(array,score_num) /* 定义count_avg这个自定义涵数的数据类型为浮点形 */
floatarray[]; /* 定义形式参数array[]这个数组为浮点形 */
intscore_num; /* 定义形式参数score_num为正形,用于得到实际参数也就是数组的元素个数 */
{
inti; /* 定义用于循环的变量i */
floatsum =array[0]; /* 预先设置总数初始值为array[0]以便于后面对比大小的操作 */
floatavg; /* 定义avg也就是平局值存储变量为浮点形 */
篇2:c中指针指针、指针的指针、指针数组和数组指针
一、指针
如果在程序中定义一个变量,在对程序进行编译,系统会自动给这个变量分配内存单元,根据不同的类型,分配不同长度的空间,如int占用4个字节,char占用1个字节,内存单元中每个字节都有编号,这就是地址。由于可通过地址能够找到所需的变量单元,可以说地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号301,这个301就是房间的地址,将该地址形象化为指针。对于一个内存单元来说,单元的地址(编号)即为指针,其中存放的数据才是该单元的内容。
严格地说,一个指针是一个地址,是一个常量,
而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。
例如:
int a=12;
int *p=&a;
二、指针的指针(二级指针)
简单来说,二级指针变量就是一级指针变量的地址。
例如:
int a=12;
int *p=&a;
int **=&p;
篇3:c/c++中的字符指针数组,指向指针的指针的含义
就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针!
先看下面的代码,注意看代码中的注解!
#include
#include
usingnamespacestd;
voidprint_char(char* array[],intlen);//函数原形声明
voidmain(void)
{
//-----------------------------段1-----------------------------------------
char*a[]={“abc”,“cde”,“fgh”};//字符指针数组
char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc\\0字符串的首地址
cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)/-------------------------------------------------------------------------
//-----------------------------段2-----------------------------------------
char* test[]={“abc”,“cde”,“fgh”};//注意这里是引号,表示是字符串,以后的地址每加1就是加4位(在32位系统上)
intnum=sizeof(test)/sizeof(char*);//计算字符串个数
print_char(test,num);
cin.get;
//-------------------------------------------------------------------------
}
voidprint_char(char* array[],intlen)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的长度
{
for(inti=0;i{
cout<<*array++<}
}
下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子:
char*a[]={“abc”,“cde”,“fgh”};
char* *b=a;
cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)<
char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc\\0,cde\\0,fgh\\0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)<结果是>结果是>
abc
cde
fgh
可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到\\0后停止.
我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout<<*array++<
到这里这两个非常重要的知识点我们都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧!
420){this.width=420}“ alt=”“ />
内存结构示意图!
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
篇4:C/C++中数组和指针类型的关系的入门教程
对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关系的了解可以更加深入的掌握数组和指针特性的知识!
一个整数类型数组如下进行定义
int a[]={1,2,3,4};
如果简单写成
a;//数组的标识符名称
这将代表的是数组第一个元素的内存地址,a;就相当于&a[0],它的类型是数组元素类型的指针,在这个例子中它的类型就是int*
如果我们想访问第二个元素的地址我们可以写成如下的两种方式!
&a[1];
a+1//注意这里的表示就是将a数组的起始地址向后进一位,移动到第二个元素的地址上也就是a[0]到a[1]的过程!
数组名称和指针的关系其实很简单,其实数组名称代表的是数组的第一个元素的内存地址,这和指针的道理是相似的!
下面我们来看一个完整的例子,利用指针来实现对数组元素的循环遍历访问!
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include
using namespace std;
void main(void)
{
int a[2]={1,2};
int *pb=a; //定义指针*pb的地址为数组a的开始地址
int *pe=a+2; //定义指针*pb的地址为数组a的结束地址
cout << a << ”|“ << a[0] << ”|“ << *(a+1) << ”|“ << pb << ”|“ << *pb <
while (pb!=pe) //利用地址进行逻辑判断是否到达数组的结束地址
{
cout << *pb << endl;
pb++; //利用递增操作在循环中将pb的内存地址不断向后递增
}
cin.get();
}
篇5:C/C++中多维数组的指针作为函数参数传递
/*程序作者:管宁
站点:www.cndev-lab.com
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include
main
{
void search_score(); /* 定义自定义涵数类型为不返回型 */
void count_avg(); /* 定义自定义涵数类型为不返回型 */
static float a[3][4]={{97,45.5,66,77},{88,92.5,78.5,66},{83,74.5,92,100}}; /* 输入3个学生的各自4门课的成绩 */
search_score(a,0); /* 调换自定义涵数显示其中一个同学的各门课成绩 */
count_avg(*a,12); /* 调换自定义涵数显示3个同学各门课的平均成绩成绩 */
/* 注意上面的*a其实也就是a[0]或者是&a[0][]0将这行改写成count_avg(a[0],12);或者count_avg(&a[0][0],12)也都是对的 */
}
void search_score(p,n)
float (*p)[4]; /* 定义一个指针变量p,说明它是一个指向一个包含4个整型变量一维数组的指针 */
int n; /* 定义形式参数n为整形 */
{
int i; /* 定义用于循环的变量i */
for (i=0;i<4;i++ ) /* 这里循环4次用于打印一个同学的4门课成绩 */
{
printf(”%7.2f“,*(*(p+n)+i));
}
printf(”\\n“);
}
void count_avg(p,n)
float *p;
int n;
{
float *p_end;
float sum = 0;
float avg;
p_end = p+n-1; /* 计算出最后一个数组元素的地址 */
for (;p<=p_end;p++) /* 循环到最后一个元素地址就停止 */
{
sum += *p;
}
avg = sum/n;
printf(”avg=%7.2f\\n“,avg);
}
/*
注意此题的意思在于输入3个同4门课的成绩,计算出平均值和显示其中一个同学的4门课成绩,此例是对多维数组指针和多维数组
的指针作为涵数参数传递的总结,认真联系和体会可以很好的了解多维数组指针的概念到底是什么!
*/
篇6:对于众多人提出的c/c++中指针难学的问题做个总结:
下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址!/*程序作者:管宁
站点:www.cndev-lab.com
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include
void main(void)
{
void reversal();
static int a[10] = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */
int i;
for (i=0;i<10;i++)
{
printf(”%d “,a);
}
printf(”\\n“);
reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x */
for (i=0;i<10;i++)
{
printf(”%d “,a);
}
printf(”\\n“);
}
void reversal(x,n)
int x[],n; /* 定义形式参数 */
{
int m=(n-1)/2; /* 计算10个数需要循环几次,因为是两两调换第一个数组是x[0]故应该是int(9/2) */
int temp,i,j; /* 建立零时变量temp用于每次交换处理时零时存储x的值 */
for (i=0;i<=m;i++)
{
j=n-1-i; /* 反向计算出被调换的数组下标,例如x[0] 对应的x[n-1-i]就是x[9] */
temp=x;
x=x[j];
x[j]=temp;
}
}
/* 次题需要注意的是:这里由于a[10]和x[10]是共同享内存地址位的所以进行交换后a[10]的实际值也就发生了改变 */
/*程序作者:管宁
站点:www.cndev-lab.com
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include
void main(void)
{
void reversal();
static int a[10] = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */
int i;
for (i=0;i<10;i++)
{
printf(”%d “,a);
}
printf(”\\n“);
reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x */
for (i=0;i<10;i++)
{
printf(”%d “,a);
}
printf(”\\n\");
}
void reversal(x,n)
int *x,n; /* 定义x为指针变量 */
{
int temp,*p,*i,*j; /* 这里需要注意的是temp用与交换的时候临时存储数据的 */
i = x; /* 利用指针变量i存储数组a的起始地址 */
p = x + ((n-1)/2); /* 计算最后一次循环的时候数组a的地址 */
j = x + n - 1; /* 计算数组a也就是a[9]的结束地址好用于交换 */
for (;i<=p;i++,j--) /* 利用循环和指针进行数组元素值的交换 */
{
temp=*i; /* 用temp临时存储*i也就是循环中a实际的值 */
*i=*j;
*j=temp;
}
}
/* 此例同样要注意到利用指针进行数组的操作同样改变了实际
★ 对于重复的思考
对于c/c++中的数组排序及计算平均值和得到最大最小值的思考(共6篇)




