houqing1999 发表于 2023-5-25 16:55:41

s1e33动动手0疑问

本帖最后由 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;
}

sfqxx 发表于 2023-5-25 17:51:39

占楼

sfqxx 发表于 2023-5-25 18:00:13

在这个程序中,`const`关键字用于修饰函数`func2`的参数,表示这些参数是只读的,不能被修改。这样做可以保证在函数内部不意外地修改这些参数值,保证代码的安全性和可靠性。

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

有用请设置最佳答案

houqing1999 发表于 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,最后这些地址怎样从小到大排序的

sfqxx 发表于 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。

houqing1999 发表于 2023-5-25 23:02:23

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

1,可是俺记得%u才是以16进制输出呀,%p不是指针类型输出地址吗,还是编译器的地址输出都是16进制数,
2,还有最后编译器用的是十六进制值,还是他的可显示字符,例如:在ASCII中十六进制值59的可显示字符是Y
页: [1]
查看完整版本: s1e33动动手0疑问