用指针输出二维数组

NickHdx 2014-04-30 09:56:33
#include<stdio.h>
int main()
{
int a[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");
return 0;
}

以上程序的运行结果为:
1 3 5 7
9 11 13 15
17 19 21 23
程序没有错。
我的疑问是:
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,是否?

求大神指点!!
...全文
506 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
NickHdx 2014-05-02
  • 打赏
  • 举报
回复
引用 12 楼 u013163178 的回复:
[quote=引用 10 楼 Freeddong 的回复:] [quote=引用 8 楼 u013163178 的回复:]
int *q;
int *p;
p = q;
q++;
q - p ==1;//不是4,也不是2
指针相减不是地址整数相减,那指针相减的内在机制是什么?或者说指针相减是不可见的?“q-p==1”其中的“1”不是整数吗?只有整数减去整数才得整数,right?[/quote]这个1表示位移的次数,不表示地址刻度,这个1表示跨过一个sizeof(int)的内存,而不是地址的数值加1,地址的数值加1表示内存跨过1个字节。[/quote]嗯 总算明白了 感谢耐心的指教!!!!
NickHdx 2014-05-02
  • 打赏
  • 举报
回复
引用 11 楼 mcmay 的回复:
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)
总算明白了,谢谢指教了!!!
li4c 2014-05-02
  • 打赏
  • 举报
回复
引用 11 楼 mcmay 的回复:
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)
正解
li4c 2014-05-02
  • 打赏
  • 举报
回复
引用 10 楼 Freeddong 的回复:
[quote=引用 8 楼 u013163178 的回复:]
int *q;
int *p;
p = q;
q++;
q - p ==1;//不是4,也不是2
指针相减不是地址整数相减,那指针相减的内在机制是什么?或者说指针相减是不可见的?“q-p==1”其中的“1”不是整数吗?只有整数减去整数才得整数,right?[/quote]这个1表示位移的次数,不表示地址刻度,这个1表示跨过一个sizeof(int)的内存,而不是地址的数值加1,地址的数值加1表示内存跨过1个字节。
mcmay 2014-05-02
  • 打赏
  • 举报
回复
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)
NickHdx 2014-05-02
  • 打赏
  • 举报
回复
引用 8 楼 u013163178 的回复:
int *q;
int *p;
p = q;
q++;
q - p ==1;//不是4,也不是2
指针相减不是地址整数相减,那指针相减的内在机制是什么?或者说指针相减是不可见的?“q-p==1”其中的“1”不是整数吗?只有整数减去整数才得整数,right?
707wk 2014-05-02
  • 打赏
  • 举报
回复
指针自加或自减的是同类型的长度
li4c 2014-05-02
  • 打赏
  • 举报
回复
int *q;
int *p;
p = q;
q++;
q - p ==1;//不是4,也不是2
li4c 2014-05-02
  • 打赏
  • 举报
回复
引用 6 楼 Freeddong 的回复:
[quote=引用 3 楼 a515360208 的回复:] int *p; p++;是加4 char *p; p++;是加1 p++实际是加的sizeof(*p的类型)
哦,我用的是整型指针。仁兄对我的第二个问题有何见解?[/quote]
#include<stdio.h>
int main()
{
    int a[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");
    return 0;
}
NickHdx 2014-05-02
  • 打赏
  • 举报
回复
引用 3 楼 a515360208 的回复:
int *p; p++;是加4 char *p; p++;是加1 p++实际是加的sizeof(*p的类型)
哦,我用的是整型指针。仁兄对我的第二个问题有何见解?
NickHdx 2014-05-02
  • 打赏
  • 举报
回复
引用 2 楼 u013545836 的回复:
这里p加一,编译器会自动识别加上一个p的类型长,比如p是int型,则加上一个整型长
既然如此,仁兄对我的第二个问题有何见解?我本想输出四个换一次行,但按指针p以整型长度的倍数增加,“p=240,,p-a[0]=240-236=4,,4%4=0”,岂不是输出两个换一次行???
NickHdx 2014-05-02
  • 打赏
  • 举报
回复
引用 1 楼 u013163178 的回复:
#include<stdio.h>
int main()
{
    int a[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]);
    return 0;
}
你是想说明a[0][0]的地址和第一个一维数组名a[0]相等吗?仁兄对我的第二个问题有何见解?
漂浮一生 2014-05-01
  • 打赏
  • 举报
回复
int *p; p++;是加4 char *p; p++;是加1 p++实际是加的sizeof(*p的类型)
小白在此 2014-04-30
  • 打赏
  • 举报
回复
这里p加一,编译器会自动识别加上一个p的类型长,比如p是int型,则加上一个整型长
li4c 2014-04-30
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
    int a[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]);
    return 0;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧