2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > c语言如何输出矩阵用指针 用指针输出二维数组解决办法

c语言如何输出矩阵用指针 用指针输出二维数组解决办法

时间:2020-11-28 10:42:03

相关推荐

c语言如何输出矩阵用指针 用指针输出二维数组解决办法

用指针输出二维数组

#include

intmain()

{

inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;

for(p=a[0];p<12+a[0];p++){

if((p-a[0])%4==0)printf("\n");

printf("%4d",*p);

}

printf("\n");

return0;

}

以上程序的运行结果为:

1357

9111315

17192123

程序没有错。

我的疑问是:

1、假设a[0]地址为236,指针p的初值则为236,因为每个int数据占两个内存空间,则a[1]地址为238。p==236时,输出*p(a[0])后,p自增一(p++),到下一个循环时,指针p的值应该为237,与a[1]的地址值238不等,那为何地址不等输出的结果是一样的,正确的?

2、对于输出换行“if((p-a[0])%4==0)printf("\n");”,每个int数据占两个内存空间,则每输出两个数据(如:a[0]和a[1])后,就应该进行一次换行,而不是输出4个数据换一次行,因为p=240,,p-a[0]=240-236=4,,4%4=0,是否?

求大神指点!!

------解决方案--------------------

#include

intmain()

{

inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;

for(p=a[0];p<12+a[0];p++){

//if((p-a[0])%4==0)

printf("\n");

printf("%d\t",*p);

}

printf("\n");

printf("%p\n",&a[0][0]);

printf("%p\n",a[0]);

return0;

}

------解决方案--------------------

这里p加一,编译器会自动识别加上一个p的类型长,比如p是int型,则加上一个整型长

------解决方案--------------------

int*p;

p++;是加4

char*p;

p++;是加1

p++实际是加的sizeof(*p的类型)

------解决方案--------------------

引用:Quote: 引用:int*p;

p++;是加4

char*p;

p++;是加1

p++实际是加的sizeof(*p的类型)哦,我用的是整型指针。仁兄对我的第二个问题有何见解?#include

intmain()

{

inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;

for(p=a[0];p<12+a[0];p++){

if(((int)p-(int)a[0])%4==0)printf("\n");//指针不是地址,指针减法不等价于(地址)整数相减

printf("%4d",*p);

}

printf("\n");

return0;

}

------解决方案--------------------

int*q;

int*p;

p=q;

q++;

q-p==1;//不是4,也不是2

------解决方案--------------------

指针自加或自减的是同类型的长度

------解决方案--------------------

p-a[0]的结果不是字节数,而是两个地址之间的距离(相当于单位长度),因为这里是把a[0](a[1]和a[3]也一样)当中的4个int当成一个整体考虑了。

看看下面的图片:

要将这个单位长度转换为字节数就要乘以sizeof(a[0]),即一个元素的字节数。

最初,p==a[0],但p++后,p==a[1],这是p-a[0]==a[1]-a[0]=1。

这里,a[0]和a[1]都是一个拥有四个元素的数组,从a[3][4]可知这一点。

从a[0]到a[1]之间有4个int,所以换算成字节数就是(a[1]-a[0])*sizeof(int)==4*sizeof(int)

------解决方案--------------------

引用:Quote: 引用:int*q;

int*p;

p=q;

q++;

q-p==1;//不是4,也不是2指针相减不是地址整数相减,那指针相减的内在机制是什么?或者说指针相减是不可见的?“q-p==1”其中的“1”不是整数吗?只有整数减去整数才得整数,right?这个1表示位移的次数,不表示地址刻度,这个1表示跨过一个sizeof(int)的内存,而不是地址的数值加1,地址的数值加1表示内存跨过1个字节。

------解决方案--------------------

引用:p-a[0]的结果不是字节数,而是两个地址之间的距离(相当于单位长度),因为这里是把a[0](a[1]和a[3]也一样)当中的4个int当成一个整体考虑了。

看看下面的图片:

要将这个单位长度转换为字节数就要乘以sizeof(a[0]),即一个元素的字节数。

最初,p==a[0],但p++后,p==a[1],这是p-a[0]==a[1]-a[0]=1。

这里,a[0]和a[1]都是一个拥有四个元素的数组,从a[3][4]可知这一点。

从a[0]到a[1]之间有4个int,所以换算成字节数就是(a[1]-a[0])*sizeof(int)==4*sizeof(int)(a[1]-a[0])*sizeof(int)==4*sizeof(int)正解

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。