问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-13 23:43

我来回答

4个回答

热心网友 时间:2023-11-08 09:59

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是怎么回事

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

热心网友 时间:2023-11-08 10:00

指针是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");
}

热心网友 时间:2023-11-08 10:00

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

热心网友 时间:2023-11-08 10:01

#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是怎么回事

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
通达信主力指标公式汇总(2023版附源码) 有什么类似地下城与勇士的手机游戏 有没有类似于DNF的游戏 苹果手机类似地下城的游戏 有什么类似地下城与勇士的手机游戏 我的系统是WIN732,为什么玩不了光晕2,一点开就弹一个对话框出来说:无法... 玩诛仙电脑配置诛仙3要求电脑配置 ...永磁为什么要跌啊?东方财富金力永磁股吧?金力永磁股票最初..._百度... 怎么找回注销的微信号 如果把手机号码和微信号同时销户后期还能找回微信号吗? 仓储与库存有什么区别? 仓位和库位的区别 在CDR里如何给洗发水瓶子的图片加出血位 做仰卧起坐,每天晚上做30个能达到减肥的效果? 哪位有宋冬野的莉莉安的mp3版本啊,可以发给我吗。 邮箱是850998702@qq.com,谢谢啦。 求推理 悬疑类小说.已看过周皓晖的罗飞系列和雷米的心理罪系列.此类小说多点啊,发我邮箱:lhbxx@139.com啊. 太阳摩羯月亮射手上升巨蟹金星水星水瓶,我是不是个矛盾体? 龙腾世纪:起源里为什么我玩的人类刺客是个GAY= =! wow女儿的拥抱中帮助做任务的莉莉安 是不是个BUG啊?我指哪打哪而且打怪都是一下秒,是不是有问题啊? 当一个男生跟女生说莉莉安董小姐我是宋冬野是什么意思? 男朋友给我备注莉莉安我该给他备注什么? 男朋友对我说:你总会看见莉莉安。 但他却不告诉我什么意思。 如何评价徐佳莹在我是歌手演唱的《莉莉安》 我的英语名是莉莉安娜,我想知道这是什么意思。 梦见在被子下面自己偷别人几圈一百元钱 彩色打印机里黑色的墨水需要添加了,可以单买黑色的吗,有单卖的吗? “绝圣弃智,民利百信;绝仁弃义,民复孝慈;绝巧弃利,盗贼无有”是什么意思? 打印机上黑色墨水彩色墨水还有上面的警告灯一起亮,无法复印黑色墨水彩色黑水无法打打印怎么办_百度问一问 打印机黑色墨水和彩色墨水两个灯都在闪烁 《昆虫记》享有什么样的誉名? 杨誉这个名字好吗请解释 什么誉什么什么 cdr出血位怎么设置,能不能超出画布的原本尺寸?就如画布尺寸为:210*297mm。出血就为216*303mm吗? c语言里面怎么用指针表示二维字符数组 c语言,指向二维数组的指针变量 C语言 指向二维数组的指针 别人做好的文件把它放在CDR里加出血位,不是一个色,(多种色或渐变色,)用那个工具做出血位好点? C语言二维数组指针变量是什么,int (*p)[2]什么意思 CDR教程教画出血位 C语言关于二维数组指针表示方法 c语言中二维数组的指针如何表示 C语言二维数组指针变量是什么?int (*p)[2]什么意思? C语言指向二维数组的指针 C语言中如何定义动态二维数组并输出 C语言二维数组指针 C语言中如何用指针运算符来表示一个二维数组的元素及地址? C语言怎么用指针代替二维数组 c语言 指针表示二维数组问题 c语言二维数组如何定义 梅州梅龙食品有限公司怎么样? 天星湖的海丰县梅陇镇天星湖村 艾仕玛迷你多功能小电炖锅怎么预约煮稀饭