还是关于const的问题?

dhfly 2007-08-03 12:08:37
有一个数组:
int * a[5][6]; //二维数组,元素为整型指针
要定义一个函数对该数组只做读取操作,所以想到用const修饰。

void f(const * p[5][6]){...}
编译不过,说无法将int *[5][6]类型转换成const int *[5][6]类型。

本来是想把p定义成二维数组,元素为指向整型常量的指针,所以在函数f中不会修改数组元素实际指向的值。

既然这样定义不行,各位高人想个方法怎样定义达到上述要求啊。
如果定义void f(const * const p[5][6]){...},可以通过,但不是愿意。


...全文
357 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dabang_007 2007-08-06
  • 打赏
  • 举报
回复
只有作形参声明的时候,[]里可以为空。
收到,明白
dhfly 2007-08-06
  • 打赏
  • 举报
回复
const int * const (*tp)[6];这个是可以成功,但是意义变了。
此处的const是修饰tp为指针常量,即tp一旦指向某个元素,就不能再指向别的元素,但指向的元素还是可以被修改。
taodm 2007-08-06
  • 打赏
  • 举报
回复
你这是定义了数组还是指针?
只有作形参声明的时候,[]里可以为空。
dabang_007 2007-08-06
  • 打赏
  • 举报
回复
taodm:typedef const int * const (*tp)[6];
这个确实可以,但是为什么typedef const int * const tp[][6];不行呢?
gexy 2007-08-06
  • 打赏
  • 举报
回复
void f(int* const(&array)[5][6])
{
}
int main()
{
int* a[5][6];
f(a);
return 0;

}
这么写应该是对数组只能只读操作
dhfly 2007-08-06
  • 打赏
  • 举报
回复
我按dabang_007的做法也得到同样的结果,调试中的i变了,输出的i没变,并且地址是一样的。
我又按下面的做法试了一下,得到奇怪的结果:
const int a = 5;
const int &b = a;
cout <<"a = " <<a <<endl; //输出5
const_cast<int &>(b) = 6;
cout <<"a = " <<a <<endl; //输出5
cout <<"b = " <<b <<endl; //输出6
cout <<"&a = " <<&a <<endl; //输出0012FF7C
cout <<"&b = " <<&b <<endl; //输出0012FF74
a的地址和b的地址不一样。调试器中a自始至终是5。

如果用下面的程序:

const int a = 5;
int &b = const_cast<int &> (a);
cout <<"a = " <<a <<endl; //输出5
b = 6;
cout <<"a = " <<a <<endl; //输出5
cout <<"b = " <<b <<endl; //输出6
cout <<"&a = " <<&a <<endl; //输出0012FF7C
cout <<"&b = " <<&b <<endl; //输出0012FF7C
上面a和b的地址相同,所以调试器中a和b的值都是6。但是输出确不一样。

那位高手出来解释一下吧。
taodm 2007-08-06
  • 打赏
  • 举报
回复
typedef const int * const (*tp)[6];
fish_autumn 2007-08-04
  • 打赏
  • 举报
回复
对于非法的操作就不要期望有任何合理的结果了
dabang_007 2007-08-04
  • 打赏
  • 举报
回复
按楼上的
int main(int argc, char* argv[])
{
const int i=10;
const int **p1;
int *p2;
p1 = (const int **)&p2;
*p1 = &i;
*p2 = 20;

cout<<i<<endl;
printf("%d\n",j);

return 0;
}
输出居然是10,但是在调试器中能看到i=20...
谁能解释啊?
taodm 2007-08-03
  • 打赏
  • 举报
回复
void f(int * const p[5][6]){...}
fish_autumn 2007-08-03
  • 打赏
  • 举报
回复
看了下面得解释我才明白为什么没有默认转换了

==========================================
为了防止指针指向的常量被修改,C标准对于指针间赋值有一个规定,就是左值必须包含右值的所有限定词。这就限定了一个指向const对象的指针不能赋值给指向非const对象的指针,但反过来就允许。这个规定初看上去非常合理,但其效用其实只限于一级指针,二级指针间的赋值即使满足规定也不再安全,下面举个例子:

const int i=10;
const int **p1;
int *p2;
p1 = &p2;
*p1 = &i;
*p2 = 20;

现在你会发现,作为常量的i的值被修改了。i的值被修改的关键原因在*p1=&i;这一句,&i是一个指向常量的一级地址,如果没有二级指针p1,受限于上述规定,作为左值接受这个一级地址的指针就必须也是一个指向常量的一级指针,于是就不能进行下一步赋值20的操作。因此,正由于指向 const对象的二级指针p1的出现,使得*p1也是一个指向const的指针,于是*p1=&i能够合法地运行,常量i的值被修改也就成了一个预想中的结果了。有鉴于此,某些编译器也会限定非const二级指针之间的赋值,规定上面的p1=&p2也是非法的。

http://blog.chinaunix.net/u1/35334/showart_301547.html
shakaqrj 2007-08-03
  • 打赏
  • 举报
回复
好像有一个const的强制转换的,一共四个,搜一下 const_cast??
dabang_007 2007-08-03
  • 打赏
  • 举报
回复
taodm能不能详细说一下如何强制类型转换呢?我强转了,不行
typedef const int * const tp[][6];
int f(tp)
{
return 0;
}
int main(int argc, char* argv[])
{
int i=10;
int *pd[5][6];
f((const int * const [][6])pd);//cannot convert from 'int *[5][6]' to 'const int *const [][6]
f((tp)pd)//cannot convert from 'int *[5][6]' to 'const int *const [][6]
printf("Hello World!\n");
return 0;
}
不知道有什么问题?
taodm 2007-08-03
  • 打赏
  • 举报
回复
那就指针类型强转呀。
dhfly 2007-08-03
  • 打赏
  • 举报
回复
不好意思,上面是我的拼写错误:

void f(const * p[5][6]){...}---->原本是void f(const int * p[5][6]){...}
void f(const * const p[5][6]){...},---->原本是void f(int * const p[5][6]){...},

我知道第二种方式是可以的,但问题是const只是修饰数组p的元素是const指针。我的理解是一旦指针p[i][j]指向某个元素,p[i][j]便不能再指向其他元素。而我要的是*p[i][j]不能被改变。
因为实际关心的是数组中存储的指针指向的元素。

是否这种方式本来就不可实现呢。

Aliens 2007-08-03
  • 打赏
  • 举报
回复
taodm是对的:void f(int * const p[5][6]){...}
数组p[5][6]的元素不能被修改
jxlczjp77 2007-08-03
  • 打赏
  • 举报
回复
void f( int* const(*m)[6] )
{
for (int i=0;i<5;++i)
{
for (int j=0;j<6;j++)
{
cout<<m[i][j]<<" ";
//m[i][j]=0; //Error: l-value specifies const object.
}
cout<<endl;
}
cout<<endl;
}
int main()
{
int* a[5][6];
for (int i=0;i<5;++i)
{
for (int j=0;j<6;++j)
{
a[i][j]=(int*)(i*6+j);
}
}
f(a);
return 0;
}
chenyu2202863 2007-08-03
  • 打赏
  • 举报
回复
你把基本的类型丢了~故错

64,282

社区成员

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

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