指针数组和数组指针表示二维数组

指针数组
概念:

    一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。

指针数组说明的一般形式为:

    类型说明符 *数组名[数组长度]

其中类型说明符为指针值所指向的变量的类型。

例如:

int *pa[3]

表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量

1、用一个指针数组来指向一个二维数组。

    指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。

#include<stdio.h> 
main()
{
    int a[3][3]={1,2,3,4,5,6,7,8,9};//1 2 3
//4 5 6
//7 8 9 int *pa[3]=
{a[0],a[1],a[2]};//指针数组 int *p=a[0]; int i; for(i=0;i<3;i++) printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));//见总结 for(i=0;i<3;i++) printf("%d,%d,%d\n",*pa[i],p[i],*(p+i)); }
总结:1:二维数组中这里的a是“指向包含三个元素的数组指针(地址)”a+1也一样;*(a+1)=a[1],
这里的+1表示跨越了三个元素,这就是跨过了第一行。
而a[1]相当于a[1][0]的数组名,也就是第二行第一列的首地址,*(a+1)也一样,则*a[1]=a[1][0],
**(a+1)=a[1][0]=*a[1].
2:而*(*(a+i)+i),后面的i是表示往后移动i个元素,联想*(p+i)一维时。

输出结果

3,1,1
5,4,5
7,7,9
1,1,1
4,2,2
7,3,3

本例程序中,pa是一个指针数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。
*pa[i]表示i行0列元素值,由于p与a[0]相同,故p[i]表示0行i列的值,*(p+i)表示0行i列的值。
    int *p[3]表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
 
二维数组指针变量
    二维数组指针变量是单个的变量,例如 int (*p)[4]表示p是一个指针变量,它指向包含4个整型元素的一维数组。
    int (*p)[4]; 表示*p有4个元素,每个元素为整型。也就是p所指的对象是有4个整型元素的数组,即p是指向一维数组的指针此时p只能指向一个包含4个元素的一维数组,p的值就是一维数组的起始地址。p不能指向一维数组中的某一元素。  
    int a[3][4];
    int (*p)[4];
    p=a;
    由于p是指向二维数组的0行元素,因此p+i是二维数组a的i行的起始地址。*(*(p+2)+3)是a[2][3]的值。
 1 #include<stdio.h> 
 2 void main()
 3 {
 4     void average(float *p,int n);
 5     void search(float (*p)[4],int n);
 6 
 7     float score[3][4]={
 8                         {65,67,70,60},
 9                         {80,87,90,81},
10                         {90,99,100,98}
11                         };
12 
13     average(*score,12); //求12个学生平均数,*score传的是第一行第一列首地址。
14     search(score,2); //求序号为2的学生成绩
15 }
16 
17 void average(float *p,int n)
18 {
19     float *p_end;
20     float sum=0,aver;
21 
22     p_end=p+n-1;
23     for( ; p<=p_end ; p++)
24         sum+=(*p);
25     aver=sum/n;
26 
27     printf("average= %5.2f \n",aver);
28 }
29 
30 void search(float (*p)[4],int n) //p是指向具有4个元素的一维数组的指针
31 {
32     int i;
33     printf("The score of No.%d are :\n",n);
34 
35     for(i=0;i<4;i++)
36         printf("%5.2f ",*(*(p+n)+i));
37     printf("\n");
38 }

 

#include<stdio.h> 
void main()
{
    
    int i;
    int score[3][4]={
                        {65,67,70,60},
                        {80,87,90,81},
                        {90,99,100,98}
                        };
    int (*p)[4]=score;                    
        for(i=0;i<12;i++)
        {
            printf("%d ",*(*p+i));//二维数组本身就是在内存就是一位线性排列。
        }
}//输出为65,67,70依次顺序输出
 
原文地址:https://www.cnblogs.com/FettersLove/p/12874661.html