c++数组的指针作为数组使用是什么原理?

img

形参的首地址和实参的首地址相同,是不是就可以通过形参的改变来修改实参了呢?

第一问:原理是指针的地址指向数组的首地址,可以通过指针来访问数组中的元素,从而达到操作数组的目的。
第二问:应该需要考虑实参的类型吧,如果实参是一个变量,就不会影响到实参,传递给函数的是拷贝。如果实参是一个指针或引用类型,那么就可以修改实参了,因为它们指向同一个内存地址。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7485378
  • 你也可以参考下这篇文章:【C++ 】指向字符的指针的地址是字符串,字符串指针就是字符串数组
  • 除此之外, 这篇博客: c++中无符号整数回绕机制以及原理解析中的 首先明确一点,在计算机内部,所有的带符号数据都是用补码表示的,那究竟为什么用补码表示呢? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 我们知道:原码的表示方法:最高位作为符号位,不表示数据,0为正,1为负。
    比如 [+1] = [0000 0001] (原码) [-1] = [1000 0001] (原码)

    反码:正数和原码相同,负数:符号位不变,其余数位取反
    [+1] = [0000 0001] (反码) [-1] = [1111 1110] (反码)

    补码:正数和原码相同,负数:符号位不变,其余数位取反+1
    [+1] = [0000 0001] (补码) [-1] = [1111 1111] (补码)

    所以到这里,基本出来了,-1对于带符号型(以8位为例)来说用补码表示自然就是 1111 1111
    对于不带符号整数来说,最高位不表示符号位,故表示255 这也是unsigned回绕机制的原理。说到底,还是计算机底层表示

  • 您还可以看一下 夏曹俊老师的C++ 设计模式原理与实战大全-架构师需备课程课程中的 将模型和视频与用户代码解耦合有门面模式的控制器来做小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    当一个数组的指针作为形参传递时,该数组指针和实际传递的数组指针是相同的,二者指向同一数组的首地址。因此,通过形参的修改可以改变实参。这是因为C++中,数组名是数组首元素的地址,可以用指向数组的指针来访问数组,将这个指针作为函数形参,相当于将指向数组的指针传递给了函数,函数内对指针的修改可以改变数组的值。

    示例代码如下:

    #include <iostream>
    using namespace std;
    
    void changeArray(int *arr, int len) {
        for(int i=0;i<len;i++){
            arr[i] = arr[i]*2;
        }
    }
    
    int main() {
        int arr[5] = {1, 2, 3, 4, 5};
        changeArray(arr, 5);
        for(int i=0;i<5;i++){
            cout << arr[i] << " ";
        }
        cout << endl;
        return 0;
    }
    

    输出结果为:2 4 6 8 10

    上述代码中,changeArray函数接受一个指向数组首元素的指针和数组长度,将数组中每个元素的值乘以2。在main函数中,定义一个长度为5的数组,并将其传递给changeArray函数,函数对数组中的值进行操作,最终在main函数中输出修改后的数组元素。由此可见,函数调用时通过传递指向数组首元素的指针,对数组进行修改的操作可以改变实参的值。