鱼C论坛

 找回密码
 立即注册
查看: 1094|回复: 5

[已解决]s1e33动动手0疑问

[复制链接]
发表于 2023-5-25 16:55:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 houqing1999 于 2023-5-25 17:33 编辑

//想问一下func2为什么要用const关键字,意义在哪


#include <stdio.h>
#include <stdlib.h>

int global_var1;
int global_var2;
static int file_static_var1;                           //另外这里的static和func1函数里面的static作用是不是不一样,如果一样,为什么
static int file_static_var2;

void func1(int func1_param1, int func1_param2)
{
        static int func1_static_var1;
        static int func1_static_var2;

        // 输出行参的地址
        printf("addr of func1_param1: %010p\n", &func1_param1);
        printf("addr of func1_param2: %010p\n", &func1_param2);

        // 输出静态局部变量的地址
        printf("addr of func1_static_var1: %010p\n", &func1_static_var1);
        printf("addr of func1_static_var2: %010p\n", &func1_static_var2);
}

void func2(const int func2_const_param1, const int func2_const_param2)
{
        int func2_var1;
        int func2_var2;

        // 输出const参数的地址
        printf("addr of func2_const_param1: %010p\n", &func2_const_param1);
        printf("addr of func2_const_param2: %010p\n", &func2_const_param2);

        // 输出局部变量的地址
        printf("addr of func2_var1: %010p\n", &func2_var1);
        printf("addr of func2_var2: %010p\n", &func2_var2);
}

int main(void)
{
        char *string1 = "I love FishC.com";
        char *string2 = "very much";

        // 输出函数的地址
        printf("addr of func1: %010p\n", func1);
        printf("addr of func2: %010p\n", func2);

        // 输出字符串常量的地址
        printf("addr of string1: %010p\n", string1);
        printf("addr of string2: %010p\n", string2);
        
        // 输出全局变量的地址
        printf("addr of global_var1: %010p\n", &global_var1);
        printf("addr of global_var2: %010p\n", &global_var2);

        // 输出文件内的static变量的地址
        printf("addr of file_static_var1: %010p\n", &file_static_var1);
        printf("addr of file_static_var2: %010p\n", &file_static_var2);

        // 输出函数内局部变量的地址
        func1(1, 2);
        func2(3, 4);

        return 0;
}
最佳答案
2023-5-25 18:00:13
在这个程序中,`const`关键字用于修饰函数`func2`的参数,表示这些参数是只读的,不能被修改。这样做可以保证在函数内部不意外地修改这些参数值,保证代码的安全性和可靠性。

另外,`static`关键字在不同的作用域中具有不同的意义。在全局作用域中,它表示该变量只能在当前文件中使用,不能被其他文件引用。在局部作用域(函数内)中,它表示该变量是静态局部变量,即该变量不会被销毁,在函数执行完毕后仍然存在,并且下次调用该函数时其值还会保持上一次的结果。

有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-25 17:51:39 | 显示全部楼层

回帖奖励 +5 鱼币

占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-25 18:00:13 | 显示全部楼层    本楼为最佳答案   
在这个程序中,`const`关键字用于修饰函数`func2`的参数,表示这些参数是只读的,不能被修改。这样做可以保证在函数内部不意外地修改这些参数值,保证代码的安全性和可靠性。

另外,`static`关键字在不同的作用域中具有不同的意义。在全局作用域中,它表示该变量只能在当前文件中使用,不能被其他文件引用。在局部作用域(函数内)中,它表示该变量是静态局部变量,即该变量不会被销毁,在函数执行完毕后仍然存在,并且下次调用该函数时其值还会保持上一次的结果。

有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-25 22:16:19 | 显示全部楼层
sfqxx 发表于 2023-5-25 18:00
在这个程序中,`const`关键字用于修饰函数`func2`的参数,表示这些参数是只读的,不能被修改。这样做可以保 ...

又有新问题了,3个
1,能否告诉我Linux中这个程序的运行结果中地址是什么意思啊这一对字母数字,用的几进制来着以addr_func_1为例:0x080483c4,
2,另外同样的程序都是%010p为啥在visual Stdio中addr_func1的地址为:00007FF795DC1145这个位数咋这么长捏
3,最后这些地址怎样从小到大排序的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-25 22:21:17 | 显示全部楼层
houqing1999 发表于 2023-5-25 22:16
又有新问题了,3个
1,能否告诉我Linux中这个程序的运行结果中地址是什么意思啊这一对字母数字,用的几 ...

1. 在Linux中,程序的运行结果中地址是指变量在内存中的位置,它是由一组16进制数字表示的。这个数字代表的是变量在计算机内存中所占的空间的起始地址,可以通过这个地址找到该变量在内存中的位置,并进行读取或修改操作。

2. %010p 这个格式化字符串表示以十六进制输出一个指针变量,并且输出的位数为10位,如果指针变量不足10位,则在左侧用0补齐。因此,在 Visual Studio 中也应该是同样的输出格式,只是地址的长度可能会有所不同。

3. 这些地址可以按照从小到大的顺序排序,也可以按照从大到小的顺序排序。一般来说,操作系统和编译器会尽可能地将内存地址安排得紧凑一些,使得相邻的变量在内存中的位置尽可能靠近,这样有助于提高内存的利用率和程序的运行效率。因此,排序后的地址可能是这样的:file_static_var1 < file_static_var2 < global_var1 < global_var2 < func1_static_var1 < func1_static_var2 < func1_param1 < func1_param2 < func2_const_param1 < func2_const_param2 < func2_var1 < func2_var2 < string1 < string2。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-25 23:02:23 | 显示全部楼层
sfqxx 发表于 2023-5-25 22:21
1. 在Linux中,程序的运行结果中地址是指变量在内存中的位置,它是由一组16进制数字表示的。这个数字代表 ...

1,可是俺记得%u才是以16进制输出呀,%p不是指针类型输出地址吗,还是编译器的地址输出都是16进制数,
2,还有最后编译器用的是十六进制值,还是他的可显示字符,例如:在ASCII中十六进制值59的可显示字符是Y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 05:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表