user-0 提问: 用指针输出二维数组

回复:
user: user-0
content: 引用 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]嗯 总算明白了 感谢耐心的指教！！！！

user: user-0
content: 引用 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)总算明白了，谢谢指教了！！！

user: user-1
content: 引用 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)正解

user: user-1
content: 引用 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个字节。

user: user-2
content: 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)

user: user-0
content: 引用 8 楼 u013163178 的回复:int *q; int *p; p = q; q++; q - p ==1;//不是4，也不是2指针相减不是地址整数相减，那指针相减的内在机制是什么？或者说指针相减是不可见的？“q-p==1”其中的“1”不是整数吗？只有整数减去整数才得整数，right?

user: user-3
content: 指针自加或自减的是同类型的长度

user: user-1
content: int *q; int *p; p = q; q++; q - p ==1;//不是4，也不是2

user: user-1
content: 引用 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; }

user: user-0
content: 引用 3 楼 a515360208 的回复:int *p; p++;是加4 char *p; p++;是加1 p++实际是加的sizeof(*p的类型)哦，我用的是整型指针。仁兄对我的第二个问题有何见解？

user: user-0
content: 引用 2 楼 u013545836 的回复:这里p加一，编译器会自动识别加上一个p的类型长，比如p是int型，则加上一个整型长既然如此，仁兄对我的第二个问题有何见解？我本想输出四个换一次行，但按指针p以整型长度的倍数增加，“p=240,，p-a[0]=240-236=4,，4%4=0”，岂不是输出两个换一次行？？？

user: user-0
content: 引用 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]相等吗？仁兄对我的第二个问题有何见解？

user: user-4
content: int *p; p++;是加4 char *p; p++;是加1 p++实际是加的sizeof(*p的类型)

user: user-5
content: 这里p加一，编译器会自动识别加上一个p的类型长，比如p是int型，则加上一个整型长

user: user-1
content: #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; }