| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5991 人关注过本帖
标题:我用 const 修饰数组为什么要警告我呢?
只看楼主 加入收藏
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
我用 const 修饰数组为什么要警告我呢?
这里是简单的对数组求和,执行结果也没错,就是会出个警告。
const修饰数组,我也没改变数组元素的值啊。
---------------------------------------------------------------------------------------我是分割线
通过2楼的回复,const修饰过的变量可以通过指针来修改。比如
const int m = 5;
int *q = &m;
*q = 3;
printf("%d", m);
以上代码会输出6。
那这样const修饰符不是失去了原来常量的意义了吗?你要修改的话,用指针绕个弯照样能修改啊。那么const为什么不设置m这个地址的内存为只读呢,那样不就连指针都不能改了吗?

----------------------------------------------------------------------------------------------------
//上代码
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define N 10

int sum_array(const int a[], int n);

int main(){
    int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum;

    sum = sum_array(a, N);

    printf("%d", sum);

    return 0;
}

int sum_array(const int a[], int n){
    int sum;
    int *p;
    sum = 0;
    for(p = a; p < a + n; p++)    //这里警告,warning: assignment discards 'const' qualifier from pointer target type [enabled by default]|
        sum += *p;                //每个单词我都认识,合一起就不知道是什么意思了
        return sum;

}



[ 本帖最后由 muyoucumian 于 2014-9-25 20:53 编辑 ]
搜索更多相关主题的帖子: 分割线 元素 
2014-09-25 20:12
dcl2014
Rank: 4
等 级:业余侠客
威 望:1
帖 子:58
专家分:273
注 册:2014-9-20
收藏
得分:10 
#include <stdio.h>
#include <stdlib.h>
#define N 10

int sum_array(const int a[], int n);

int main(){
    int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum;

    sum = sum_array(a, N);

    printf("%d", sum);

    return 0;
}

int sum_array(const int a[], int n){
    int sum;
    const int *p;                //在这里加一个const修饰一下就好了,a是const int的数组,P也声明为const,这样就是说不可以通过P来修改a里面的                           //内容了
    sum = 0;
    for(p = a; p < a + n; p++)    //这里警告,warning: assignment discards 'const' qualifier from pointer target type [enabled by default]|
        sum += *p;                //每个单词我都认识,合一起就不知道是什么意思了
        return sum;

}
2014-09-25 20:30
dcl2014
Rank: 4
等 级:业余侠客
威 望:1
帖 子:58
专家分:273
注 册:2014-9-20
收藏
得分:0 
话说如果 按照你原来的程序 我的电脑上是报错啊 不仅仅是警告啊!就在那个地方,编译器不一样的缘故吗?
2014-09-25 20:33
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
回复 3 楼 dcl2014
可能是吧,我用的是codeblocks,编译器是什么我自己也不知道。
2014-09-25 20:41
dcl2014
Rank: 4
等 级:业余侠客
威 望:1
帖 子:58
专家分:273
注 册:2014-9-20
收藏
得分:0 
那你按照我说的改之后 还有警告码?
2014-09-25 20:45
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:10 
简单说说:
编译器都会越来越智能
C语言来说: const int和 int 是两种不同的类型 这点一定要弄清楚。

从 const int 转换到 int 就会警告 这时C语言的规定
2014-09-26 21:18
hjxlj
Rank: 10Rank: 10Rank: 10
来 自:江西
等 级:贵宾
威 望:14
帖 子:292
专家分:1519
注 册:2013-6-25
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define N 10
int sum_array(const int a[], int n);
int main()
{
    int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum;
    sum = sum_array(a, N);
    printf("%d\n", sum);
    return 0;
}

int sum_array(const int a[], int n)
{
    int sum;
    sum = 0;
    for(int y = 0; y < n; y++)
      sum += * (a + y) + 1; //这里我愣是将数组的每个元素值加1,即无错误也无警告
    return sum;
}


上面注释中我更改了形参数组每个元素的值(其实就是将每个元素的原值加1),在VC6下编译时既无错误也无警告,运行结果为65,楼主的代码运行结果为55。

本人QQ:775420425
2014-09-26 22:51
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 7 楼 hjxlj
你在那条sum=......后面加一,又没有改变数组。它警告什么?

想抽苏烟了。
2014-09-27 19:33
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
回复 8 楼 fl8962
—_—,楼上哥们晕乎了,哈哈
2014-09-27 21:32
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
const int m = 5;
int *q = &m;//VS2010报错:error C2440: 'initializing' : cannot convert from 'const int *' to 'int *'
*q = 3;
printf("%d", m);

你们数组这个代码p的赋值语句也报错,还是加个const吧,为了代码移植性
2014-09-27 21:35
快速回复:我用 const 修饰数组为什么要警告我呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.148180 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved