关于引用数组的一点点疑问。

/*引用*//*输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数...1...输入10个数..2..进行处理...3...输出10个数... /*引用*/
/*输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
写3个函数...1...输入10个数..2..进行处理...3...输出10个数 */

#include <iostream> //预处理命令
using namespace std;
void deal(int& a[]); //函数声明
int main()
{
int b[10]; //定义变量
int i;

cout << "请输入10个整数:" <<endl; //输入
for (i = 0; i < 10; i++)
cin >> b[i];
cout << endl;

deal (b); //处理,函数调用

cout << "下面是转换结果:" <<endl; //输出结果
for (i = 0; i < 10; i++)
cout << b[i] << " " ;
cout<<endl;

return 0;
}

void deal (int& a[10])
{
int j; //定义变量
int k;
int m;
for (j = 0; j < 9; j++) //最小放最前
if (a[j] > a[j+1])
j = j+1;
k = a[j];
a[j] = a[0];
a[0] = k;

for (j = 0; j < 9; j++) //最大放最后
if (a[j] < a[j+1])
j=j+1;
k = a[j];
a[j] = a[9];
a[9] = k;
}

00.错误原因:b是一个地址,但不占用内存空间,引用b时,下面的函数也不占内存空间。
deal;错。
00.00 改正方法:将函数声明和调用部分改为 void deal(int * &a)
然后加上int* p = b;deal(b);运行正常。
00.01 void deal(int* p)和void deal(int* &b)的不同点是 第二个相当于*p; &b = *p;
01.疑问:有地址可以无内存空间?
02.疑问:b不是相当于b[0]地址?
03.疑问:P取b的地址[调用]跟直接调用b的地址不同?定义了指针即可解决问题?
展开
 我来答
chiconysun
2011-02-26 · TA获得超过2.2万个赞
知道大有可为答主
回答量:5410
采纳率:92%
帮助的人:2549万
展开全部
关于这些问题,有关概念的理解细化如下:
void deal(int& a[]);的含义是形参为整型引用的数组,不过C++的引用不能声明数组,因此该函数原型错误,更不用说函数的实现了

void deal(int* p)和void deal(int* &b)的差别在于:
前面的p是函数里面的形参(局部变量),通过传递整型指针(也就是整型变量的地址)的值,在函数体内可以绕弯将外面的变量改了。
后面的b是整型指针的引用,也就是整型指针变量的别名,并不是函数的局部变量,调用时必须用整型变量去绑定,修改该引用就是修改调用的变量

关于疑问的解释如下:
有地址一定有内存空间,除非值为0(NULL),只是空间不一定你的程序可用,你程序错误具体原因在下面
请注意C++中(C也不例外),指针必须类型完全一致(包括数据类型与const等的修饰次序在内)才能直接赋值,当然,C++ 中引用的绑定规则也是一样
b虽然值就是b[0]的地址,但是不可变,因此类型为常量指针,请将函数形参变为int *const &p,再用b 去调用,看看是否还报错,看看可否实现要求(附:去掉&也可以,请自行理解其含义差别)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式