函数调用的问题?

daisy0432 2004-11-16 11:12:18
#include "iostream.h"

void putValues(const int *);
int main()
{
int arr[3]={1,2,3};
putValues(arr);
return 0;
}

void putValues(const int* a)
{
for(int i=0;i<3;i++)
cout<<a[i]<<endl;
}
调用函数putValues(const int* a)时,根据函数声明,实参应该是一个指向整型常量的指针,但是此程序中实参是一个数组名,数组名是一个指针常量,那么这样的调用应该报错啊,怎么程序运行正常呢?
如果把函数参数作一下修改,形参为int* const a
#include "iostream.h"

void putValues(int const *);
int main()
{
int arr[3]={1,2,3};
putValues(arr);
return 0;
}

void putValues(int* const a)
{
for(int i=0;i<3;i++)
cout<<a[i]<<endl;
}
出现错误,unresolved external symbol "void __cdecl putValues(int const *)" (?putValues@@YAXPBH@Z)
在const修饰符的使用上还有许多不明白的地方,还希望大家不吝赐教!
...全文
121 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wildhorseych 2004-11-16
  • 打赏
  • 举报
回复
判断const修饰的到底是指针还是,所值内容可以根据const相对于*的位置
const 只要在*的左边,则表示该指针所指向的内容为常量
const只要在*的右边,则表示该指针本身为常量
因此楼主你如下函数
void putValues(int* const a)
{
for(int i=0;i<3;i++)
cout<<a[i]<<endl;
}
说明你的参数为一个常量指针

另外,数组当作参数传递的时候自动退化为一个同类型指针
beyondtkl 2004-11-16
  • 打赏
  • 举报
回复
哈哈。。。
xuzheng318 2004-11-16
  • 打赏
  • 举报
回复
怎么看到你好几次都是乱回答问题的呢?
///////////////////////////////////
我只是解决楼主第二个程序为什么无法编译

我怎么叫乱回答了??
carylin 2004-11-16
  • 打赏
  • 举报
回复
按你的意思,
void putValues(int const *);
应该写成
void putValues(int *const );。
因为
void putValues(int const *);

void putValues(const int *);
等价


Andy84920 2004-11-16
  • 打赏
  • 举报
回复
to xuzheng318(forever C++) (老迈马甲NO.1)(学如逆水行舟,不进则退):
怎么看到你好几次都是乱回答问题的呢?
Andy84920 2004-11-16
  • 打赏
  • 举报
回复
const int* a;
知道 a是什么意思吗?
这里a就是一个指向不能改变的东西,而不是讲a本身不能改变,所谓a本身改变就是指
它还可以指向其它的地方,随便指到哪里去,如果是int *const a;那么a在初始化后就
不能再改变指向的地方了.但指向的东西却可以改变.

而数组名是一个常量,所以你用一个const int *可以指向它而不能改变它.

你的改过之后的错误是因为:你的声明是:void putValues(int const *);
而定义是:void putValues(int* const a)两个形参都不一样.
xuzheng318 2004-11-16
  • 打赏
  • 举报
回复
把头文件改成#include <iostream.h>
两个就都没有问题了!
daisy0432 2004-11-16
  • 打赏
  • 举报
回复
to gujianhua:
按你所说,
const int *a;
如果将数组名arr作为实参传递,那么arr++;//对 *arr++;//错
这样对吗?

daisy0432 2004-11-16
  • 打赏
  • 举报
回复
不好意思,我写错了,第二个程序应该是两个参数都是 int * const a的型式
gujianhua 2004-11-16
  • 打赏
  • 举报
回复
const int * a;或int const * a;
指针本身可变,指针所指向的值不可变。即: *a = 1;//错 a++; //对

int * const a;
指针本身不可变, 指针所指向的值可变。 即:*a = 1; //对 a++;//错

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧