C++指针
Published in:2024-11-16 | category: C++
Words: 1.2k | Reading time: 4min | reading:

从内存修改的角度对int* arrint& arr区别的详细解释:

内存访问机制

  • int* arr :当使用int* arr作为函数形参时,函数接收到的是一个指向内存中某个int类型数据的地址。在函数内部,通过对指针进行解引用操作*arr来访问和修改该指针所指向的内存位置的值。这意味着函数可以通过指针间接地修改外部传递进来的变量或数组元素所对应的内存空间中的数据。
  • int& arr :而对于int& arr,它是对一个int变量的引用,本质上是该变量的别名。在函数内部对arr的任何操作,实际上都是直接对引用所绑定的原始int变量进行操作,直接修改的就是该变量所占用的内存空间中的值,不需要像指针那样进行解引用操作。

对外部变量的影响

  • int* arr :由于函数通过指针能够直接访问和修改指针所指向的内存,因此在函数内部对*arr的修改会直接反映到外部传递进来的变量或数组元素上。例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>

    void modifyValue(int* arr) {
    *arr = 100;
    }

    int main() {
    int num = 50;
    modifyValue(&num);
    std::cout << num << std::endl;
    return 0;
    }
    在上述代码中,modifyValue函数接收了num的地址,通过指针解引用将num所在内存的值修改为100,所以最终输出为100
  • int& arr :同样地,因为引用直接绑定到外部变量,所以在函数内部对引用的修改也会直接影响到外部变量。例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>

    void modifyValue(int& arr) {
    arr = 200;
    }

    int main() {
    int num = 150;
    modifyValue(num);
    std::cout << num << std::endl;
    return 0;
    }
    在这个例子中,modifyValue函数中的arrnum的引用,对arr的修改就是对num的修改,所以最终输出为200

数组作为参数时的内存修改

  • int* arr :当传递数组时,数组名会隐式转换为指向数组首元素的指针。在函数内部,可以通过指针算术运算来遍历数组元素,并修改它们所对应的内存值。例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>

    void modifyArray(int* arr, int size) {
    for(int i = 0; i < size; ++i) {
    *(arr + i) = i * 10;
    }
    }

    int main() {
    int arr[] = {1, 2, 3, 4, 5};
    modifyArray(arr, 5);
    for(int i = 0; i < 5; ++i) {
    std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
    return 0;
    }
    modifyArray函数中,通过*(arr + i)的方式依次修改了数组arr每个元素所对应的内存值,所以最终输出为0 10 20 30 40
  • int& arr :若要使用引用传递数组,通常需要使用一些特殊的方法,如传递数组的引用或使用模板等。相对来说,使用指针在处理数组时更为直接和常见。不过,一旦正确地使用引用传递数组,对数组元素的修改方式与使用指针类似,都是直接修改数组元素所占用的内存空间中的值,只是在语法上不需要进行指针解引用操作。

内存安全性考虑

  • int* arr :使用指针时,需要特别注意指针的合法性和有效性。如果传递了一个无效的指针,如空指针或者指向已经释放的内存的指针,那么在函数内部对该指针进行解引用操作时,将会导致程序出现段错误或其他未定义行为,从而影响程序的稳定性和安全性。因此,在使用指针时,通常需要在函数内部进行指针有效性的检查,以确保程序的健壮性。
  • int& arr :引用在定义时必须初始化,并且在其生命周期内始终绑定到同一个有效的对象,不会出现类似指针的悬空引用或无效引用的情况。所以在一定程度上,使用引用作为函数参数时,在内存访问的安全性方面相对更有保障,只要确保引用的初始化是正确的,就可以放心地在函数内部对其进行操作,而不必担心出现指针相关的内存错误。

综上所述,int* arrint& arr在内存修改方面都能够实现对外部变量或数组元素的修改,但它们在内存访问机制、对外部变量的影响方式、数组处理的便捷性以及内存安全性等方面存在着一些差异。在实际编程中,需要根据具体的需求和场景来选择合适的方式来传递参数和操作内存。

Prev:
模电(一)二极管
Next:
软考复习不太懂的题