求C语言高手指点:请问如何指针定义二维数组?? 请用 **p ,(*P)[ ] ,*p[ ] 三种来进行指针定义

这几种方法逻辑上都好理解,但我就是在具体表达上面有很大问题,求高手指点,最好举个例子。回答满意的话再加分

int a[4][5],*p[4],i; //p表示指针数组
for( i=0;i<4;i++ )
p[i]=a[i];
/*有了这个定义后,指针数组p中的每一个指针分别指向了二维数组a每一行的首地址,以后通过p就可以访问a */
访问格式:p[i][j] , (*(p+i))[j] , *(*(p+i)+j) , *(p[i]+j) 都表是a[i][j]
eg: p[1][1]=1; //相当于a[1][1]=1;

_______________________________________________________________________

int a[4][5],(*p)[5]; //p表示数组指针
p=a;
/*有了这个定义后,数组指针p指向了二维数组a的首地址,以后通过p就可以访问a */
访问格式:p[i][j] , (*(p+i))[j] , *(*(p+i)+j) , *(p[i]+j) 都表是a[i][j]
eg: p[1][1]=1; //相当于a[1][1]=1;

______________________________________________________________________

**p主要用在函数传值上,如:

main()
{ int a[4][5],*p[4],i;
for( i=0;i<4;i++ )
p[i]=a[i];
……
fun (p );
……
}

这是fun 函数的首部就可以表示成:
fun( int **p )
{ p[1][1]=1; //相当于主函数中的a[1][1]=1;
……
}追问

顺便问一下,运行时老出现Segmentation fault是怎么回事

追答

应该是指针未指向地址或地址越界出错的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-10
指针是C语言的精髓,学好C语言必须得学好指针!祝你学业有成!!
**p是二级指针。
(*P)[ ]是数组指针。
*p[ ]是指针数组。
所谓二级指针:如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。就会出现二级指针·三级指针。。。。。
举个例子:#include<stdio.h>
void main ()
{
char *a[]={"You","are","very","wise!"};
char * * p;
for(int i=0;i<4;i++)
{
p=a+i; //a是数组名,也算是指针,指向数组的首地址。把指针地址赋给p,p里面
//存放的就是另外一个指针a的地址了.即为二级指针,定义指针时要使用**p.
printf("%s\n",*p);
}
}
(*P)[ ]是数组指针。它与指针数组的区别是*p是用括号括起来的,*p是一个整体。数组指针是由多个相同类型的指针组成的一个集合!
比如说给你了一个数组a[3][4],要你用数组指针(*p)[4]把用户指定的数组a中的元素输出!看下面的例子。
int a[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
int (*p)[4];
int m,n;
printf("请输入要您要查询的元素位置");
scanf("%d %d",&m,&n);
p=a;
printf("%d ",(*(p+m-1))[n-1]);
你要是输入了2,3,那结果就是7.
*p[ ]是指针数组。意思就是说这个数组里面全部都是指针!同样是上面的这个数组a[3][4],我们用指针数组*p[3 ]把数组a中的元素全部输出!
int a[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
int * p[3];

p[0]=a[0];
p[1]=a[1];
p[2]=a[2];
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
printf("%d ",*p[i]+j);
printf("\n");
}
第2个回答  2011-07-10
1**p指针变量用于指向指针类型变量时,我们称之为指向指针的指针变量

类型标识符**指针变量名例如:float**ptr;其含义为定义一个指针变量ptr,它指向另一个指针变量(该指针变量又指向一个实型变量)。由于指针运算符“*”是自右至左结合,所以上述定义相当于:float*(*ptr);
[例6-27]用指向指针的指针变量访问一维和二维数组。
#include
#include
main()
{
int a[10],b[3][4],*p1,*p2,**p3,i,j;/是*p指3向指针的指针变量*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);/*一维数组的输入*/
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&b[i][j]);/*二维数组输入*/
for(p1=a,p3=&p1,i=0;i<10;i++)
printf("M",*(*p3+i));/*用指向指针的指针变量输出一维数组*/
printf("\n");
for(p1=a;p1-a<10;p1++)/*用指向指针的指针变量输出一维数组*/
{p3=&p1;printf("M",**p3);}
printf("\n");for(i=0;i<3;i++)/*用指向指针的指针变量输出二维数组*/
{
p2=b[i];p3=&p2;
for(j=0;j<4;j++)
printf("M",*(*p3+j));
printf("\n");}
for(i=0;i<3;i++)/*用指向指针的指针变量输出二维数组*/
{p2=b[i];
for(p2=b[i];p2-b[i]<4;p2++)
{p3=&p2;printf("M",**p3);}printf("\n");}
}
对一维数组a来说,若把数组的首地址即数组名赋给指针变量p1,p1就指向数组a,数组的各元素用p1表示为,*(p1+i),也可以简化为*p1+i表示

如果继续作将p3=&p1,则将p1的地址传递给指针变量p3,*p3就是p1。用p3来表示一维数组的各元素,只需要将用p1表示的数组元素*(p1+i)中的p1换成*p3即可,表示为*(*p3+i)。同样,对二维数组b来说,b[i]表示第i行首地址,将其传递给指针变量p2,使其指向该行。该行的元素用p2表示为*(p2+i)。若作p3=&p2,则表示p3指向p2,用p3表示的二维数组第i行元素为:*(*p3+i)。这与程序中的表示完全相同。
========================================
int *p[4],i; //p表示指针数组
for( i=0;i<4;i++ )
p[i]=a[i];
/*有了这个定义后,指针数组p中的每一个指针分别指向了二维数组a每一行的首地址,以后通过p就可以访问a */
访问格式:p[i][j] , (*(p+i))[j] , *(*(p+i)+j) , *(p[i]+j) 都表是a[i][j]
eg: p[1][1]=1; //相当于a[1][1]=1;
===================================
int (*p)[n];  p为指向整型二维数组的指针变量,二维数组的列数为n
第3个回答  2011-07-10
#include<stdio.h>
void main()
{
int i,j;
int a[][3] = {{1,2,3},{4,5,6},{7,8,9}};
int **p,(*p1)[3] ,*p2[3];
/////////////////////////////////
p1 = &a[0];//p1为数组指针,是一个指针变量所以只需要将一维数组的地址赋给他
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++)
printf("%d ",p1[i][j]);

printf("\n");
}

/////////////////////////////////
for(i = 0; i < 3; i++)
p2[i] = a[i];//p2为指针数组,所以把每个一维数组的首地址赋给他
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++)
printf("%d ",p2[i][j]);

printf("\n");
}
//////////////////////////////////
for(i = 0; i < 3; i++){
p = p2;//p是指向指针的指针,即*p = 指针(p2是指针数组,所有元素为指针)
//这样就建立一个桥梁 **p-----*p[]------p[][]
for(j = 0; j < 3; j++)
printf("%d ",p[i][j]);

printf("\n");
}

}
运行结果:
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
我将这几个的用法用同一个实例演示了一下,由于指针用法很灵活,可以有多种不同表达方式,所以更细节的东西还要楼主自己慢慢摸索,希望我的回答对你有用。追问

顺便问一下,运行时老出现Segmentation fault是怎么回事

相似回答