c/c++:数组指针与指针数组

数组指针与指针数组

C语言中的指针和数组是两个非常基础的概念,它们可以用来处理复杂的数据结构和算法。而在指针和数组的基础上,又有两个重要的概念,那就是指针数组和数组指针。在本篇文章中,我们将详细介绍它们的定义、用法、案例、区别和注意事项。

1.指针数组

定义

指针数组,顾名思义,指针的数组,是一个数组,其中每个元素都是指针类型,表示该元素存放的是一个指针变量的地址。例如:

int *ptrArr[10]; //一个包含10个指针的数组,每个指针指向一个整型变量

用法

指针数组可以使用正常的数组下标进行操作,也可以用指针的方式进行操作。例如下面的代码:

int num1 = 1, num2 = 2, num3 = 3;
int *ptrArr[3] = { &num1, &num2, &num3};

for (int i=0; i<3; i++){
    printf("The address of num%d is %p, and its value is %d\n", i+1, ptrArr[i], *(ptrArr[i]));
}

数组的每个元素都是一个指向整数的指针变量,可以通过 for 循环遍历数组输出每个元素的地址和值。
c/c++:数组指针与指针数组_第1张图片

案例

指针数组常见的应用是在字符串处理中,可以将一个字符串拆分成多个单词,每个单词都放在指针数组的一个元素中,例如:

#include
#include

int main(){
    char str[]="Hello World";
    char *pArr[20];
    int count=0;

    pArr[0]=strtok(str," ");
    while(pArr[count]!=NULL){
        count++;
        pArr[count]=strtok(NULL," ");
    }

    for(int i=0;i<count;i++){
        printf("The %dth word is %s.\n",i+1,pArr[i]);
    }

    return 0;
}

该程序将字符串 “Hello World” 拆分成两个单词并输出。
c/c++:数组指针与指针数组_第2张图片

注意事项

使用指针数组时需要注意以下几点:

指针的类型必须与数组元素的类型相匹配。
需要保证指针指向的数据类型相同。
指针数组的下标从0开始,最大索引需要小于数组长度减1,否则会越界。

2.数组指针

定义

数组指针,顾名思义,数组的指针,是指针,是指向数组的指针,也就是一个指针变量,它存放的是一维或多维数组的首地址。所以一般在多维数组的时候用到数组指针。例如:

int (*ptrArr)[10]; //一个指向包含10个整数的数组的指针

用法

数组指针可以用正常的指针方式进行操作,或者用数组的方式进行操作,例如下面的代码:

int numArr[3][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
int (*ptrArr)[5] = numArr;

for (int i=0; i<3; i++){
    for (int j=0; j<5; j++){
        printf("%d\t", *(*(ptrArr+i)+j));
    }
    printf("\n");
}

该代码中,数组指针 ptrArr 存放了 numArr 数组的首地址,可以使用 dereference 和加法运算符来访问数组元素,也可以像普通数组那样使用下标运算符来访问数组元素。

案例

数组指针常见应用是使用动态内存分配来声明一个动态多维数组,例如:

int m = 4, n = 5;
int **ptrArr = new int *[m];
for (int i = 0; i < m; i++){
    ptrArr[i] = new int [n];
}

for (int i = 0; i < m; i++){
    for (int j = 0; j < n; j++){
        ptrArr[i][j] = i * n + j;
    }
}

for (int i = 0; i < m; i++){
    for (int j = 0; j < n; j++){
        printf("%d ", ptrArr[i][j]);
    }
    printf("\n");
}

for (int i = 0; i < m; i++){
    delete[] ptrArr[i];
}
delete[] ptrArr;

该代码使用 new 运算符动态分配一个 m 行 n 列的二维数组,初始化并输出数组元素,最后释放内存。

注意事项

使用数组指针时需要注意以下几点:

数组指针的大小等于数组元素的大小乘以数组元素的个数,即 ptrArr 整体大小为 4 x 5 x sizeof(int)。
在使用数组指针时,需要明确数组的长度,在访问指向的数组时需要保证数组下标不越界。
需要注意数组维数的问题,多维数组需要使用括号括起来才能定义出数组指针变量,例如 int (*)[20][30] p;

区别

指针数组和数组指针最简单的区别是,前者是一个数组,它的每个元素都是一个指针,而后者是指向数组的指针,它存放的是数组的首地址。

指针数组多用于存储一组不同类型的数据,或者分隔有相同类型的数据,甚至可以混合使用不同数据类型的指针。而数组指针多用于处理一组相同类型的数据,或者处理多维数组。

在操作数组元素时,指针数组需要使用解引用符号,而数组指针可以像数组一样使用下标运算符。

总结

指针数组和数组指针都是非常重要的C语言概念。在使用时,需要根据具体情况选取合适的类型。指针数组适合存储不同类型的指针以及用于处理字符串等问题,而数组指针适合用于处理多维数组或动态内存分配等问题。在使用时,还需要注意数组下标不越界等问题。

你可能感兴趣的:(c语言,c++,笔记,开发语言,算法)