您的位置:

利用指针访问C++数组元素

在C++中,数组是一组相同类型的变量组成的集合,可以通过数组的下标来访问每个元素。C++中的指针是一种特殊的变量,它存储着某个变量的内存地址。通过指针,我们可以访问数组中的元素而不必使用下标运算符。

一、使用指针访问数组元素


// 定义一个包含5个元素的数组
int arr[5] = {1, 2, 3, 4, 5};
// 定义指向整型变量的指针
int *p;
// 指针指向数组的第一个元素
p = arr;
// 输出数组的第一个元素值
std::cout << *p << std::endl;
// 指针指向数组的第二个元素
p = arr + 1;
// 输出数组的第二个元素值
std::cout << *p << std::endl;

在上面的代码中,我们定义了一个包含5个元素的数组,然后定义了一个指向整型变量的指针p,p指向数组的第一个元素arr[0]。接着,我们输出了通过p指针访问的第一个元素的值,即* p,然后将指针p指向数组的第二个元素arr[1],最后输出通过指针p访问的第二个元素值。

二、指针与数组下标的关系

C++中数组下标与指向数组元素的指针是等价的,对数组下标的操作本质上也是对指针的操作。下面我们通过一个示例来说明指针与数组下标之间的关系:


// 定义一个包含5个元素的数组
int arr[5] = {1, 2, 3, 4, 5};
// 输出arr[0]的值
std::cout << arr[0] << std::endl;
// 输出*arr的值
std::cout << *arr << std::endl;
// 输出arr[2]的值
std::cout << arr[2] << std::endl;
// 输出*(arr+2)的值
std::cout << *(arr + 2) << std::endl;

在上面的代码中,我们定义了一个包含5个元素的数组,然后通过数组下标操作和指针操作分别访问了该数组的第一个元素arr[0]和第三个元素arr[2]。在指针操作中,因为指针指向的是数组元素的地址,因此我们通过arr + 2来获得数组中第三个元素的地址,接着将该地址解引用得到其对应的元素值。

三、指针与多维数组

在C++中,多维数组是一维数组的拓展,其元素可以是一维数组或其他多维数组。对于二维数组,可以使用指针进行访问,具体的做法是先定义一个指向一维数组的指针,然后使用二维数组下标访问时,将该下标去掉最后一个,映射成指向一维数组的指针。下面我们通过一个示例说明二维数组的指针访问。


// 定义一个包含3行4列的二维数组
int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
// 定义指向一维数组的指针p
int (*p)[4];
// 指针p指向数组第一行
p = arr;
// 输出数组中的所有元素
for(int i = 0; i < 3; i++){
    for(int j = 0; j < 4; j++){
        std::cout << *(*p + j) << " ";
    }
    std::cout << std::endl;
    p++;
}

在上述代码中,我们定义了一个包含3行4列的二维数组arr,并定义一个指向一维数组的指针p,p指向数组第一行。接着我们使用两重循环遍历每个元素,对于每个元素,首先通过*p得到指向一维数组的指针,然后将其地址加上列数j,即*(p+j),得到该数组元素对应的值。

四、指针与字符数组

C++中,字符数组是一种特殊的数组,它的特点是数组中的每个元素都是字符类型。我们可以使用指针来访问字符数组,并可以通过指针对字符数组进行操作。下面我们通过一个示例来说明指针与字符数组的访问。


// 定义一个字符数组
char str[] = "Hello World";
// 定义指向字符数组的指针p
char *p;
// 指针p指向字符数组的第一个元素
p = str;
// 输出字符串中的所有字符
while(*p != '\0'){
    std::cout << *p;
    p++;
}
std::cout << std::endl;

在上述代码中,我们定义了一个字符数组str,然后定义了一个指向字符数组的指针p,p指向数组的第一个元素str[0]。接着,我们通过对指针p解引用,输出了字符串中的所有字符。在循环中,每次输出一个字符后,我们将指针p加1,指向下一个字符。

总结

通过本文的介绍,我们了解了如何使用指针访问C++数组元素,并掌握了指针与数组下标、多维数组、字符数组的关系。在实际编程中,灵活运用指针可以让我们更高效地操作数据结构,提高程序的执行效率。