0

这是在函数中传递数组的工作程序,但我无法理解在print函数中只传递了数组的基地址,但我仍然可以使用 subscript 访问数组a[i]。我知道正确的方法是*(a+i),但为什么它也适用于下标?

#include <iostream>
#include <conio.h>
void print(int *a);
using namespace std;
int main()
{
    int arr[3]={1,2,3};
    print(arr);
    getch();
    return 0;
}
void print(int *a)
{
    for(int i=0;i<3;i++)
    {
        cout<<a[i];//how we are able to access array with subscipt a[i]
    }
}
4

3 回答 3

3

由于您正在传递一个指针(指向特定的内存地址),即使在函数内部,您也可以像往常一样对待它。指针和数组关系非常密切,使用起来也很好。

a[0] 和 *a 是一样的,所以 a[1] 和 *(a+1) 等等。

“指针等同于它指向的第一个元素的地址” - 来自http://www.cplusplus.com/doc/tutorial/pointers/

于 2013-04-20T20:36:17.417 回答
0

数组可以这样传递,但另一种方法是把数组名放在空[]后面:

#include <iostream>
#include <conio.h>
void print(int *a);
using namespace std;
int main()
{
    int arr[3]={1,2,3};
    print(arr);
    getch();
    return 0;
}
void print(int a[])
{
    for(int i=0;i<3;i++)
    {
        cout<<a[i];//how we are able to access array with subscipt a[i]
    }
}

两种方法都传递数组中第一个数字的地址,因此两种方法都有效。

于 2013-04-20T21:24:54.373 回答
0

//我们如何使用下标 a[i] 访问数组

a[i]和 是一样的*(a + i)


就像现在一样,您print适用于精确大小为 3 的数组,因此:

  • 如果数组恰好有超过 3 个元素,则某些元素将不会被打印。
  • 如果它恰好小于 3,您将访问数组后面的内存中的任何内容,这是未定义的行为(翻译:非常糟糕!)。

当您将数组传递给函数时,数组的大小会被“遗忘”,因此要么显式传递大小以使函数可重用所有大小的数组(可重用性毕竟是拥有函数的关键!)...

void print(int const* a, size_t a_size) {
    for (size_t i = 0; i < a_size; ++i) // size_t is the appropriate type here, not int.
        std::cout << a[i] << std::endl; // Use std::endl to be able to discern where teh current number ends and the next starts!
}

// ...

int arr[3] = {1, 2, 3};
const size_t arr_size = sizeof(arr) / sizeof(arr[0]);
print(arr, arr_size);

...或以 C++ 方式执行并使用std::vector...

void print(const std::vector<int>& a) {
    for (const auto& s : a) // The new C++11 "for each" syntax.
        std::cout << s << std::endl;
}

// ...

std::vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
print(a);

...甚至使它通用...

template <typename T>
void print(const std::vector<T>& a) {
    for (const auto& s : a)
        std::cout << s << std::endl;
}
于 2013-04-20T22:00:43.450 回答