C++程序设计——十五

C 指向数组的指针,指向二维数组的指针,指针数组

我们前面提到*符号和&符号,他们可以用来创建指针变量和取地址。
这里,我们介绍指针与数组的关系。

指向数组的指针

#include <stdio.h>

int main()
{
    int array1[5]={1,2,3,4,5};//创建一个整型数组
    int *p;
    //定义一个指向整型变量的指针变量
    //指针变量p存储某个整型变量的地址
    p=array1;//p存储数组中第一个变量的地址
    //同p=&array1[0];
    //下面输出数组中每个元素的值
    printf( "使用指针的数组值\n");
   for ( int i = 0; i < 5; i++ )
   {
       printf("*(p + %d) : %d\n",  i, *(p + i) );
   }
 
   printf( "使用 array 作为地址的数组值\n");
   for ( int i = 0; i < 5; i++ )
   {
       printf("*(array1 + %d) : %d\n",  i, *(array1 + i) );
   }

    return 0;
}

我们创建一个指针变量和一个数组,数组名称就代表数组首元素的地址,我们也可以使用&array1[0]来取得首元素地址。
输出如下

使用指针的数组值
*(p + 0) : 1
*(p + 1) : 2
*(p + 2) : 3
*(p + 3) : 4
*(p + 4) : 5
使用 array 作为地址的数组值
*(array1 + 0) : 1
*(array1 + 1) : 2
*(array1 + 2) : 3
*(array1 + 3) : 4
*(array1 + 4) : 5

指向二维数组的指针

首先来回顾一下二维数组,比如int a[3][4]={{7,8,9,12},{45,625,54,98},{14,15,32,74}};
它表示创建一个二维数组,其中第一维有三个元素:
{7,8,9,12}、{45,625,54,98}和{14,15,32,74}
而第二维有四个元素,即第一维的每个元素都是一个一维数组(这些一维数组有四个元素)
既然第一维的元素都是有四个元素的数组,那么指向二维数组的指针类型应该也是一维数组指针,即int(*p)[4]=a;它表示p为一个一维数组指针,且这个一维数组长度为4,简单来说,指针变量p指向一个数组,数组的类型为int [4];
[ ]的优先级高于*,( )是必须要加的,如果赤裸裸地写作int *p[4],那么应该理解为int *(p[4]),p 就成了一个指针数组,而不是二维数组指针,这在《C语言指针数组》中已经讲到。
示例如下

#include <stdio.h>
int main(){
    int a[3][4] = {{7,8,9,12},{45,625,54,98},{14,15,32,74}};
    //定义一个二维数组
    int (*p)[4] = a;
    //定义一个指向该二维数组的指针
    //也可以int (*p)[4] = a;

    for(int i=0;i<=2;i++)
    {
        for(int j=0;j<=3;j++)
        {
            printf("二维数组的第%d行第%d个元素%d:\n",i,j,*(*(p+i)+j));
        }
        printf("\n");
    }
    
    return 0;
}

其实很好理解,和单独表示时*(p+i)指首元素的值不同,在*(*(p+i)+j))里面*(p+i)是表示取到第i个一维数组的首元素地址,那么加1就代表地址加1,再用*符号取值即得到第i行第j列的值
(因为在内存中所有的数组元素都是连续排列的,先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行)
输出如下

二维数组的第0行第0个元素7:
二维数组的第0行第1个元素8:
二维数组的第0行第2个元素9:
二维数组的第0行第3个元素12:

二维数组的第1行第0个元素45:
二维数组的第1行第1个元素625:
二维数组的第1行第2个元素54:
二维数组的第1行第3个元素98:

二维数组的第2行第0个元素14:
二维数组的第2行第1个元素15:
二维数组的第2行第2个元素32:
二维数组的第2行第3个元素74:

指针数组

指针数组其实就是由指针变量组成的数组,这种数组中的每个元素都是一个指针变量,存储一个地址,我们对存储的地址使用*符号可以取出该地址上的值

#include <stdio.h>
 
int main ()
{
    int array[]={12,123,1234,56};
    int *p[4];//定义一维指针数组,每个元素都存储一个整型变量的地址
    for(int i=0;i<=3;i++)
    {
        p[i]=&array[i];
        //为每个元素赋值,赋值为一个地址,所以用&符号
    }
    for(int i=0;i<=3;i++)
    {
        printf("使用指针数组取出数组array第%d个元素的值%d\n",i,*p[i]);
    }
    int a[3][4] = {{7,8,9,12},{45,625,54,98},{14,15,32,74}};
    int *pp[3][4];//定义一个二维指针数组
    for(int i=0;i<=2;i++)
    {
        for(int j=0;j<=3;j++)
        {
            pp[i][j]=&a[i][j];
        }
    }

    for(int i=0;i<=2;i++)
    {
        for(int j=0;j<=3;j++)
        {
            printf("使用二维指针数组,输出二维数组的第%d行第%d列的元素值:%d\n",i,j,*pp[i][j]);
        }
    }

    return 0;
}

输出如下

使用指针数组取出数组array第0个元素的值12
使用指针数组取出数组array第1个元素的值123
使用指针数组取出数组array第2个元素的值1234
使用指针数组取出数组array第3个元素的值56
使用二维指针数组,输出二维数组的第0行第0列的元素值:7
使用二维指针数组,输出二维数组的第0行第1列的元素值:8
使用二维指针数组,输出二维数组的第0行第2列的元素值:9
使用二维指针数组,输出二维数组的第0行第3列的元素值:12
使用二维指针数组,输出二维数组的第1行第0列的元素值:45
使用二维指针数组,输出二维数组的第1行第1列的元素值:625
使用二维指针数组,输出二维数组的第1行第2列的元素值:54
使用二维指针数组,输出二维数组的第1行第3列的元素值:98
使用二维指针数组,输出二维数组的第2行第0列的元素值:14
使用二维指针数组,输出二维数组的第2行第1列的元素值:15
使用二维指针数组,输出二维数组的第2行第2列的元素值:32
使用二维指针数组,输出二维数组的第2行第3列的元素值:74

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值