指针问题(指针数组,数组指针,二级指针)

inta[3][3]={{111},{222},{333}}int*p[3];p=a;for(i=0;i<3;i++){for(j=0;J<3;j++)printf("%... int a[3][3]={{111},{222},{333}}
int *p[3];
p=a;
for(i=0;i<3;i++)
{
for(j=0;J<3;j++)
printf("%d\t",p[i][j]);
printf("\n");
}
可以将数组输出来,结果
111
222
333
现在想要改变1,2两行输出顺序,
222
111
333
用改变指针指向的方法,求大神指导!!!!!!!!!
展开
 我来答
视觉篮球
推荐于2016-02-08 · TA获得超过555个赞
知道小有建树答主
回答量:158
采纳率:100%
帮助的人:105万
展开全部
#include <stdio.h>
int main()
{
int a[3][3]={{1,1,1},{2,2,2},{3,3,3}};
int (*p)[3]=a;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==0)
{
printf("%d\t",p[i+1][j]);
}
if(i==1)
{
printf("%d\t",p[i-1][j]);
}
if(i==2)
{
printf("%d\t",p[i][j]);
}
}
printf("\n");
}
return 0;
}
我用下标控制了一下,这个好像不能用改变指针指向的方法,因为你的程序就是通过下标访问的方式输出的,如果用改变指针指向的方法,就得通过改变指针的偏移量来访问数组了。你好看一下二级指针的用法,下面附一点小资料。
资料:
概括的说,指针其实就是可变数组的首地址,说是可变数组,是
指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充
分节约宝贵的内存资源。我一向喜欢一维数组,除非万不得已,我一
般是不用二维数组的,多维的则更是很少涉足了。因为一维简单,容
易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更
具有讨论的必要。
闲话少说,这里我就以三个二维数组的比较来展开讨论:
(1)、int **Ptr;
(2)、int *Ptr[ 5 ];
(3)、int ( *Ptr )[ 5 ];
以上三例都是整数的二维数组,都可以用形如 Ptr[ 1 ][ 1 ] 的
方式访问其内容;但它们的差别却是很大的。下面我从四个方面对它们
进行讨论:
一、内容:
它们本身都是指针,它们的最终内容都是整数。注意我这里说
的是最终内容,而不是中间内容,比如你写 Ptr[ 0 ],对于三者来说,
其内容都是一个整数指针,即 int *;Ptr[ 1 ][ 1 ] 这样的形式才
是其最终内容。
二、意义:
(1)、int **Ptr 表示指向"一群"指向整数的指针的指针。
(2)、int *Ptr[ 5 ] 表示指向 5 个指向整数的指针的指针。
(3)、int ( *Ptr )[ 5 ] 表示指向"一群"指向 5 个整数数
组的指针的指针。
三、所占空间:
(1)、int **Ptr 和 (3)、int ( *Ptr )[ 5 ] 一样,在32位平
台里,都是4字节,即一个指针。
但 (2)、int *Ptr[ 5 ] 不同,它是 5 个指针,它占5 * 4 = 20
个字节的内存空间。
四、用法:
(1)、int **Ptr
因为是指针的指针,需要两次内存分配才能使用其最终内容。首
先,Ptr = ( int ** )new int *[ 5 ];这样分配好了以后,它和(2)的
意义相同了;然后要分别对 5 个指针进行内存分配,例如:
Ptr[ 0 ] = new int[ 20 ];
它表示为第 0 个指针分配 20 个整数,分配好以后, Ptr[ 0 ] 为指
向 20 个整数的数组。这时可以使用下标用法 Ptr[ 0 ][ 0 ] 到
Ptr[ 0 ][ 19 ] 了。
如果没有第一次内存分配,该 Ptr 是个"野"指针,是不能使用
的,如果没有第二次内存分配,则 Ptr[ 0 ] 等也是个"野"指针,也
是不能用的。当然,用它指向某个已经定义的地址则是允许的,那是另外
的用法(类似于"借鸡生蛋"的做法),这里不作讨论(下同)。
(2)、int *Ptr[ 5 ]
这样定义的话,编译器已经为它分配了 5 个指针的空间,这相当
于(1)中的第一次内存分配。根据对(1)的讨论可知,显然要对其进行一次
内存分配的。否则就是"野"指针。
(3)、int ( *Ptr )[ 5 ]
这种定义我觉得很费解,不是不懂,而是觉得理解起来特别吃力,
也许是我不太习惯这样的定义吧。怎么描述它呢?它的意义是"一群"
指针,每个指针都是指向一个 5 个整数的数组。如果想分配 k 个指针,
这样写: Ptr = ( int ( * )[ 5 ] ) new int[ sizeof( int ) * 5 * k ]。
这是一次性的内存分配。分配好以后,Ptr 指向一片连续的地址空间,
其中 Ptr[ 0 ] 指向第 0 个 5 个整数数组的首地址,Ptr[ 1 ] 指向第
1 个 5 个整数数组的首地址。
综上所述,我觉得可以这样理解它们:
int ** Ptr <==> int Ptr[ x ][ y ];
int *Ptr[ 5 ] <==> int Ptr[ 5 ][ x ];
int ( *Ptr )[ 5 ] <==> int Ptr[ x ][ 5 ];
这里 x 和 y 是表示若干的意思。
sunnyapi
2012-08-04 · TA获得超过1031个赞
知道小有建树答主
回答量:376
采纳率:100%
帮助的人:366万
展开全部
我简单写了下 功能是实现了 但是感觉写的不够精简 楼主先看看 也许能找到好办法精简一下
#include <stdio.h>
int main()
{
int a[3][3]={{1,1,1},{2,2,2},{3,3,3}};
int b[3][3]={{1,1,1},{2,2,2},{3,3,3}};
int (*p)[3]=a;
int temp0;
temp0=p[0][0];
p[0][0]=a[1][0];
a[1][0]=temp0;
int temp1;
temp0=p[0][1];
p[0][1]=a[1][1];
a[1][1]=temp1;
int temp2;
temp0=p[0][2];
p[0][2]=a[1][2];
a[1][2]=temp2;
for(int k=0;k<3;k++)
{
p[1][k]=b[0][k];
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
printf("%d\t",p[i][j]);
printf("\n");
}
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
恶魔被打败
2012-08-05
知道答主
回答量:13
采纳率:0%
帮助的人:4.6万
展开全部
··这个去我爱秘籍学习把
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式