标题:请教高手一个常量指针的问题!
只看楼主
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
结帖率:100%
已结贴  问题点数:20 回复次数:24 
请教高手一个常量指针的问题!
代码是这样的:
程序代码:
# include <stdio.h>
# include <stdlib.h>
#define bool int
#define false 0
#define true 1

struct family
    {
        char name[20];
        int age;
    };

bool fun(struct family const * no1, struct family const * no2);

int main(void)
{
    struct family no1 = {"tom", 10};
    struct family no2 = {"sam", 20};

    struct family  * p1 = &no1;
    struct family  * p2 = &no2;

    fun(p1, p2);

    printf("\n%d, %d\n", p1->age, p2->age);

    return 10;
}

bool fun(struct family const * no1, struct family const * no2)
{
    printf("\nEnter %s's age: ", no1->name);
    scanf_s("%d", &no1->age, 1);
    printf("\nEnter %s's age: ", no2->name);
    scanf_s("%d", &no2->age, 1);
    
    /*
    no1->age = 60;
    no2->age = 80;
    */
    return true;
}

请问 const 将传递给函数 fun 的结构指针规定为常量, 那么结构 no1, 和 no2, 就是不能被修改的,那为什么在 fun 中使用scanf()可以改变成员的值?而注释部分的语句却不能修改成员值?
搜索更多相关主题的帖子: family false 
2014-05-28 13:54
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
const貌似是c++的东西吧

DO IT YOURSELF !
2014-05-28 14:02
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
是的,创建的源文件是.cpp结尾
2014-05-28 14:16
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
版主,这次貌似错了哈

学习了,原来还有这种事

百度了下,据说是因为scanf, printf等因为用了"操作符"的原因,所以不是类型安全的……
不懂……

[ 本帖最后由 pycansi 于 2014-5-28 14:52 编辑 ]


莫问前尘有愧,但求今生无悔
2014-05-28 14:50
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
得分:0 
const 要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值(l-value)。
如果能被scanf函数改变,则要关注scanf函数是怎么做到的
2014-05-28 14:55
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
得分:0 
指针改变的知识指向的地址啊

我不是砖家,要努力成为砖家。
2014-05-28 15:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
關於scanf()的這類問題,我解釋過很多次,真的不想再重複了。

授人以渔,不授人以鱼。
2014-05-28 15:14
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
回复 7 楼 TonyDeng
上次你给我解释过关于局部变量在内存的分配和释放问题让我受益匪浅,关于scanf的问题确实有不少人问,这说明这个函数有很多容易犯错的细节问题,这些问题可能书本上没有,是实际问题中发现,我建议版主单独开一贴,专门讲解scanf的常见问题,并且长期置顶,
2014-05-28 15:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
置頂的東西沒人看的。

授人以渔,不授人以鱼。
2014-05-28 15:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
先回答關於const的問題:const,是指示編譯器對指針的理解,比如const char* p這個,是告知編譯器,在後面編譯時,不要放行試圖修改該指針p所指向的數據的語句。注意,這僅僅是編譯器在編譯時的行爲,而不是程序運行時的行爲。雖然p被聲明爲指向const數據的指針,但你仍然可以把p的值(即其所指向數據的地址)賦給另外一個非const指針q,再對q進行解引用修改q所指向的數據!現在你明白了嗎?編譯器的確不放過對p所指向數據的修改,但它放過q所指向的數據的修改。scanf()的那個問題,就是這樣造成的。

授人以渔,不授人以鱼。
2014-05-28 16:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-432183-1-1.html




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

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