标题:请教高手一个常量指针的问题!
取消只看楼主
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
结帖率:100%
已结贴  问题点数:20 回复次数:6 
请教高手一个常量指针的问题!
代码是这样的:
程序代码:
# 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
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
是的,创建的源文件是.cpp结尾
2014-05-28 14:16
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
回复 7 楼 TonyDeng
上次你给我解释过关于局部变量在内存的分配和释放问题让我受益匪浅,关于scanf的问题确实有不少人问,这说明这个函数有很多容易犯错的细节问题,这些问题可能书本上没有,是实际问题中发现,我建议版主单独开一贴,专门讲解scanf的常见问题,并且长期置顶,
2014-05-28 15:34
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
回复 10 楼 TonyDeng
也就是说,fun()这个函数在原型中就规定了它有两个形参no1,no2。它们都是 family 类型的结构指针,但是由于 const 的原因,这两个指针所指向的数据是不允许被修改的,所以出现 no1->age = 60; no2->age = 80; 的时候编译器一眼就看出了这两个语句在修改no1,no2指向的值,编译器就不会放行。

但是scanf()可以修改结构中的成员数据是因为,no1,no2中的地址被拷贝了一份,类似于镜像一样发送给了scanf(),这两个拷贝的地址和no1,no2指向了同样的结构成员,但是它们没有被规定为const,所以可以通过这两个拷贝的镜像在运行程序时修改它们指向的结构成员。

在书上看到过“按值传递机制”,当时不太懂,现在明白了。版主你说的这句话(注意,這僅僅是編譯器在編譯時的行爲,而不是程序運行時的行爲。)很有深意!是书本上没有的经验之谈,值得菜鸟好好揣摩。
再次感谢版主耐心的回答了被问烦了的scanf()问题!
2014-05-28 16:55
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
回复 15 楼 TonyDeng
呵呵,所以问scnaf的人很多,楼主有没有介绍scanf的文章,如果有的话贴出来给新手学习学习,这会让我们少走很多弯路。
2014-05-29 09:15
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
回复 19 楼 TonyDeng
我看的那本《C语言入门经典》里有一节就是讲 <变元个数可变的函数>, 书上说首先要包含 <stdarg.h> 这个头文件,然后使用3个宏:va_start()、va_arg()、va_end() .........
当时看的云里雾里的也没完全懂,总觉得有个隐患留下了,现在看来还得好好去研究一下。
2014-05-30 15:17
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
得分:0 
回复 20 楼 TonyDeng
const * p :  把p指向的那个变量当做常量,其数值不能被修改。
* const p : 不能改变存放在p中的地址,但是p所指向变量的数值是可以修改的
这么理解没错吧。
2014-05-30 15:28



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




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

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