MST

星途 面试题库

面试题:C语言左值与指针的复杂应用

编写一个函数 `swap_values`,该函数接收两个指针参数,要求在函数内部交换这两个指针所指向的变量的值。假设调用函数时传入的实参是两个整型变量的地址。同时,解释为什么要使用指针作为参数来实现这个功能,以及左值在这个过程中的作用。如果传入的不是左值会出现什么情况?
39.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 交换两个整数的函数
void swap_values(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

为什么使用指针作为参数

  1. 直接操作原变量:在C语言中,函数参数传递是值传递。如果不使用指针,传递的是变量的值的副本,在函数内部对副本的修改不会影响到原变量。而使用指针,函数可以直接访问和修改调用函数中变量的内存地址,从而实现对原变量值的交换。
  2. 实现数据共享:通过指针,不同函数可以共享和修改同一块内存区域的数据,这在许多复杂的数据结构和算法实现中非常重要。

左值在这个过程中的作用

左值是可以出现在赋值语句左边的表达式,它代表一个可寻址的内存位置。在 swap_values 函数中,*a*b 是左值,因为它们代表了实际变量的内存位置,可以被赋值。如果没有左值,就无法将一个值赋给特定的内存位置,也就无法实现交换值的操作。

如果传入的不是左值会出现什么情况

如果传入的不是左值,比如传入的是常量或者一个不代表可寻址内存位置的表达式,编译时会报错。因为C语言不允许对非左值进行赋值操作。例如:

swap_values(5, 10); // 错误,5和10不是左值

这里5和10是常量,它们没有内存地址可以被修改,所以这样的调用是不合法的。在调用 swap_values 函数时,必须传入代表可寻址内存位置的左值,也就是变量的地址。