用指针输出二维数组
#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)正解