【C++沉思录】数组和指针的寻址

来源:互联网 发布:easing.js 编辑:程序博客网 时间:2024/05/18 02:28
     数组是相同数据类型的数据集合,以线性方式连续存储在内存中,而指针只是保存一个地址值的4字节变量。在使用中,数组名是一个地址常量值,保存数据首元素地址,不可修改,因此只能以基地址访问内存数据。指针是一个变量,可以修改,随意访问内存数据。
     数组作为参数和返回值,都是将数组的首地址以指针的方式进行传递,但是它们也有不同。将数组作为参数时,其定义所在的作用域必然在函数调用以外,在调用之前已经存在。而数组作为函数的返回值则有一定的风险。急当数组作为局部变量数据时,便出现了稳定性问题。

P.S. 字符类型的数组的赋值(初始化)其实是复制字符串的过程。这里并不是单字节的复制,而是每次复制4字节的数据。

     访问数组的方式有两种:通过下标寻址和通过指针寻址。指针寻址没有下标寻址便利,效率也低。因为指针是存放地址数据的变量类型,因此在数据访问的过程中,要先取出指针变量中的数据,然后再针对数据进行地址偏移计算,从而寻址到目标数据。而数组名本身就是常量地址,可直接对数据名所代替的地址进行偏移计算。

     1. 当下标值为整型常量时,由于类型大小已知,编译器可直接计算出数据所在的地址。其寻址过程与局部变量相同。
     2. 当下标值为整型变量时,编译器无法计算出相应的地址,只能先进行地址偏移计算,然后得出目标数据所在的地址
     3. 当下标值为整型表达式时,先计算出表达式的结果,然后将其结果作为下标值。如果是常量计算,常量会被折叠,最后还是以常量为下标寻址。