变量易混淆问题

变量易混淆问题

#include 
static int global = 1;  // 全局变量

void modify(int param) {
    static int static_local = 1;  // 静态局部变量
    int local = 1;                // 普通局部变量
    // 修改函数传参的值
    param *= 2;
    // 修改全局变量
    global *= 2;
    static_local *= 2;    // 修改静态局部变量
    local *= 2;    // 修改普通局部变量
    printf("test函数内部:param=%d, global=%d, static_local=%d, local=%d\n",
           param, global, static_local, local);
}

void modify_global(int global) {
    global = 100;
}

int main(void) {
    int param_a = 10;
    int param_b = 20;
    printf("初始值:param_a=%d, param_b=%d, global=%d\n\n", param_a, param_b, global);
    modify(param_a);
    printf("第一次调用后:param_a=%d, global=%d\n\n", param_a, global);
    modify(param_b);
    printf("第二次调用后:param_b=%d, global=%d\n\n", param_b, global);
    modify_global(global);
    printf("after modify_global global = %d\n", global);
    return 0;
}

问题一:通过modify函数调用,能不能修改param_aparam_b的取值呢?为什么?

不能。C语言中函数参数传递是值传递,modify函数接收到的paramparam_aparam_b值的副本,在函数内对param的修改不会影响实参param_aparam_b

问题二:能不能在main函数当中访问静态局部变量static_local呢?为什么?

不能。静态局部变量的作用域仅限于其定义所在的函数内部,main函数不在static_local的作用域内,所以无法访问。

问题三:全局变量global使用static修饰,这里的static关键字是什么作用?

static修饰全局变量global,使其作用域被限制在当前源文件内,其他源文件无法通过extern引用,防止不同源文件同名全局变量冲突。

问题四:modify函数的两次调用中,printf输出打印的自身局部变量local的取值是一样的吗?为什么?

取值一样,都是2。普通局部变量每次函数调用时重新分配内存并初始化,modify函数中local每次都初始化为1,然后乘以2得到2。

问题五:modify函数内部修改了全局变量global的取值,两次调用printf函数输出的结果是什么?为什么?

第一次调用modifyglobal为2,第二次调用后为4。因为全局变量在整个程序运行期间都存在,可被各函数修改,每次modify调用都将global乘以2 。

问题六:modify函数内部修改了静态局部变量static_local的取值,两次调用printf函数输出的结果是什么?为什么?

第一次调用modifystatic_local为2,第二次调用后为4。静态局部变量只在首次调用函数时初始化,后续调用保留上次的值,每次modify调用都将其乘以2。

问题七:modify_global函数希望修改global全局变量的取值,可以修改成功吗?为什么?

不能成功。modify_global函数中的global是形参,是局部变量,和全局变量global是不同变量,对形参global的修改不会影响全局变量global

你可能感兴趣的:(嵌入式,c语言)