指针数组:由若干个具有相同存储类型和数据类型的指针变量构成的集合。
指针数组通俗易懂的说也就是一堆指针的集合。
int a[2][3]={{8,7,9},{1,3,2}};
int * p[2] ;
p[0]=a[0];
p[1]=a[1];
printf("%d %d %d\n",a[0][1], *(p[0]+1), *(a[0]+1));
return 0;
这是三种方式找出数组中某一位置的元素。
1>直接在数组中指定某行某列输出结果。
2>指针指向二维数组的某行开头,移动指针取出数据。
3>二维数组的行数组也就是相对应的列数组的指针,指针移动取数据。
利用一个指针数组处理 一个二维数组,并且求出所有二维数组的和;
代码如下:
int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int *p[4];
int m;
for(m=0;m<4;m++){
p[m]=a[m];
}
int i,j;
int sum=0;
int sum_1=0;
int sum_2=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
sum+= * (p[i]+j);
sum_1+= * ( * (p+i)+j);
sum_2+=* ( *(a+i)+j);
}
}
printf(“二维数组总和: %d %d %d”,sum,sum_1,sum_2);
这里的 * (p+i)+j相当于把二维数组一维数组化了,先找完一行,然后紧接着找第二行,一次类推,直到找完所有的元素为止。
多级指针:
把一个指向指针变量的指针变量。称为多级指针。
对于指向处理数据的指针变量称为一级指针。
把指向一级指针变量的指针变量称为二级指针变量。
多级指针初始化:int * * q;(二级指针)
int * 是目标类型,*q本身是指针。
代码如下:
int a[2]={11,99};
int *p[2];
int * *q;
p[0]=a;
p[1]=&a[1];
q=p;
printf("%d %d\n",a[0],a[1]);
printf("%d %d\n",*p[0],*p[1]);
printf("%d %d\n",q,(q+1));
return 0;
可见三种方式都可以取数据。
刚开始在二级指针指向一级指针出出错,我写的q= * p;
q是二级指针,p是一级指针数组的数组名,其实p也就是指向一级指针起始位置的二级指针,所以这里可以直接写成q=p;
**q 其中 *q表示取一级指针数组中第一个元素存取的地址, *( *q)表示继续取一级指针指向的数组中存取的数据。