你预期的是什么样的?aver() 里面的循环结束条件应该是 i<n,导致不符合预期的应该就是这里,数组下标越界,程序能运行的话,a[n]读到的数是其它程序内存里面的,数值不确定,输出结果也就不确定。
这个代码执行main()方法,里面先声明有一个aver(float a[], int n);方法,有两个参数,一个浮点数数组,一个是数组长度。
然后声明了两个浮点数数组,一个长度为5,一个长度为10。
两个printf()输出提示信息,紧跟后面的for循环及scanf("%f", &zu1[i]);表示循环接受输入将数字存入数组中。
然后调用aver()方法,分别计算这两个数组中数值的平均值,再输出这个平均值。输出fload的精度默认小数点后6位。如果要格式化指定小数点位数,可以在 %f之间添加数字,如 %.2f 表示2位小数,小数点前面一般不指定位数。如果需要指定,表示整个长度,前可以前补0,如 %07.2f 表示整个数值长7位(含小数点),2位小数,前补0
#include <bits/stdc++.h>
using namespace std;
void test(int *b)
{
cout << "形参指针地址:" << &b << endl;
cout << "形参指向内容:" << *b << endl;
cout << "实参和形参指向同一地址,但实参指针变量和形参指针变量自身地址不一致,可以看出传参方式为值传递而并非引用传递" << endl;
cout << endl;
cout << "==更改后==" << endl;
int num2 = 2;
b = &num2;
cout << "型参指向内容:" << *b << endl;
}
int main()
{
int num = 1;
int *a = #
cout << "==更改前==" << endl;
cout << "实参指针地址:" << &a << endl;
cout << "实参指向内容:" << *a << endl;
test(a);
cout << "实参指向内容:" << *a << endl;
return 0;
}
运行结果:
==更改前==
实参和形参指向同一地址,但实参指针变量和形参指针变量自身地址不一致,可以看出为值传参而并非引用传参
实参指针地址:0x61fe10
形参指针地址:0x61fdf0
==更改后==
型参指向内容:2
实参指向内容:1
简而言之:指针a和指针b在一开始指向同一变量,但指针a和指针b自身所在的地址不同。
在test函数中,指针b指向了其他的变量,所以修改内容没有同步到指针a指向的变量
即test函数参数传递为值传递
如果想要更加详细的理解,参考博客:很好的指针传参理解博客
段落3中的参考资料给出了一个问题描述和输出要求,即输入一个句子,计算其中单词个数和平均长度。段落6中给出了一个完整的C语言程序,来解决这个问题。因此,可以考虑阅读这个程序,找出其中的解决方法。
这个程序中定义了一个max
函数,它的参数是一个字符串和一个整型指针num
,返回值是一个整型。主函数中定义了一个字符串English
,并通过gets
函数从标准输入中读取一行字符串。然后,调用max
函数计算出单词的个数和平均长度,最后按要求格式输出这两个值。
下面是max
函数的具体实现:
int max(char ch[],int *num)
{
int maxlength=0,i=0,length=0,len=0, j = 0;
while(ch[i]!='\0')
{
if(ch[i]!=' ')
length++;
else if(ch[i]==' ')
{
if(length!=0)
{
j++;
len+=length;
}
length=0;
}
i++;
if(ch[i]=='\0')
{
if(length!=0)
{
j++;
len+=length;
}
}
}
*num = j;
len /= *num;
return len;
}
这个函数的实现比较简单,它使用一个while
循环遍历字符串中的每一个字符。如果遇到非空格的字符,就认为正在处理一个单词,此时单词长度加一。如果遇到空格,说明当前单词已经结束,如果当前单词长度不为0,就将单词个数加一,并将单词长度累加到总长度上。当循环结束后,需要特殊处理最后一个单词:如果最后一个单词的长度不为0, 就需要将它的长度累加到总长度和单词个数上。最后,计算出平均长度,将个数保存在num
指向的位置上,返回平均长度。
可见,这个程序的实现比较简单明了,通过遍历字符串并分析其中每个单词的长度,实现了对单词个数和平均长度的计算。因此,可以作为解决问题的一个参考。