user-0 提问: 关于C Primer Plus课后练习题

回复:
user: user-0
content: 引用 12 楼 paschen 的回复:[quote=引用 10 楼 login0201 的回复:] [quote=引用 9 楼 qq423399099 的回复:] torf +2才是你所谓的移动到第三行的第一列   大神讲全了哈。 可是ptf +2 不是等于 &torf[2] 吗？这两个不等吗？ [/quote]  你的ptr是int类型的指针，所以+2移动的是两个int类型距离 而torf 是数组类型，+2移动的是两个这种类型数组的距离[/quote]  是不是如果定义为： int *ptr[2]; 这样的话，ptr +2 = &torf [2] .

user: user-1
content: 引用 10 楼 login0201 的回复:[quote=引用 9 楼 qq423399099 的回复:] torf +2才是你所谓的移动到第三行的第一列   大神讲全了哈。 可是ptf +2 不是等于 &torf[2] 吗？这两个不等吗？ [/quote]  你的ptr是int类型的指针，所以+2移动的是两个int类型距离 而torf 是数组类型，+2移动的是两个这种类型数组的距离

user: user-2
content: http://edu.csdn.net/course/detail/2516

user: user-0
content: 引用 9 楼 qq423399099 的回复:torf +2才是你所谓的移动到第三行的第一列   大神讲全了哈。 可是ptf +2 不是等于 &torf[2] 吗？这两个不等吗？

user: user-3
content: torf +2才是你所谓的移动到第三行的第一列

user: user-0
content: 引用 6 楼 qq_36409192 的回复:[quote=引用 4 楼 login0201的回复:][quote=引用 2 楼 qq_36409192 的回复:] 二维数组中，初始化赋值没有表示出来的部分用0表示。。那么在你这个二维数组中，其实你就是将第一行的值赋了三个值，后面两行都是0。 另外，在二维数组中，行标可以省略，列表不能省略，也就是说，你的指针其实指向的是第一行的三个数，当你在进行指针的加减的时候，其实也只是在第一行中进行移动在。。  望采纳。。   这是个两行两列的数组，怎么可能第一行有三个元素，您这解释完全不对了。[/quote] 不好意思。。看错了。。二维数组存储形式是以一行行的形式存储在一行中，所以你在访问的时候。。当你读完第一行的内容以后。。会开始读第二行，这也是为何你+2以后的值会是16。。表示的其实就是第二行的第一个数。。[/quote]   数组的记数是从0开始的，+2其实是第三行了不是，可是题目这个数组只有两行两列。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价     这是二维数组，这个好像都是一维数组。

user: user-4
content: 引用 4 楼 login0201的回复:[quote=引用 2 楼 qq_36409192 的回复:] 二维数组中，初始化赋值没有表示出来的部分用0表示。。那么在你这个二维数组中，其实你就是将第一行的值赋了三个值，后面两行都是0。 另外，在二维数组中，行标可以省略，列表不能省略，也就是说，你的指针其实指向的是第一行的三个数，当你在进行指针的加减的时候，其实也只是在第一行中进行移动在。。  望采纳。。   这是个两行两列的数组，怎么可能第一行有三个元素，您这解释完全不对了。[/quote] 不好意思。。看错了。。二维数组存储形式是以一行行的形式存储在一行中，所以你在访问的时候。。当你读完第一行的内容以后。。会开始读第二行，这也是为何你+2以后的值会是16。。表示的其实就是第二行的第一个数。。

user: user-2
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-0
content: 引用 2 楼 qq_36409192 的回复:二维数组中，初始化赋值没有表示出来的部分用0表示。。那么在你这个二维数组中，其实你就是将第一行的值赋了三个值，后面两行都是0。 另外，在二维数组中，行标可以省略，列表不能省略，也就是说，你的指针其实指向的是第一行的三个数，当你在进行指针的加减的时候，其实也只是在第一行中进行移动在。。  望采纳。。   这是个两行两列的数组，怎么可能第一行有三个元素，您这解释完全不对了。

user: user-0
content: 引用 1 楼 u012604633 的回复:*ptr即*(ptr+0)  对应a[0][0] ，*(ptr+1) 对应a[0][1]， *(ptr+2) 对应a[1][0] ，*(ptr+3) a[1][1]， 数组在内存里是按序存储的  *ptr = a[0][0] =12 这个无异议。   可是 *(ptr+1) 为什么等于 a[0][1]，为什么不是 a[1][0]。那么*(*ptr+1) 又等于什么？ 同理 *(ptr+2) 为什么不等于 a[2][0]。

user: user-4
content: 二维数组中，初始化赋值没有表示出来的部分用0表示。。那么在你这个二维数组中，其实你就是将第一行的值赋了三个值，后面两行都是0。 另外，在二维数组中，行标可以省略，列表不能省略，也就是说，你的指针其实指向的是第一行的三个数，当你在进行指针的加减的时候，其实也只是在第一行中进行移动在。。  望采纳。。

user: user-5
content: *ptr即*(ptr+0)  对应a[0][0] ，*(ptr+1) 对应a[0][1]， *(ptr+2) 对应a[1][0] ，*(ptr+3) a[1][1]， 数组在内存里是按序存储的

user: user-6
content: 首先ptr是int*的，那么ptr+2，就是ptr向前偏移了2个int的地址，ptr是a[0][0]，而数组在内存中是顺序排列的，a[0][0]偏移两个int就是a[1][0]，就是16

user: user-1
content: 引用 15 楼 login0201 的回复:[quote=引用 14 楼 paschen 的回复:] [quote=引用 13 楼 login0201 的回复:] [quote=引用 12 楼 paschen 的回复:] [quote=引用 10 楼 login0201 的回复:] [quote=引用 9 楼 qq423399099 的回复:] torf +2才是你所谓的移动到第三行的第一列   大神讲全了哈。 可是ptf +2 不是等于 &torf[2] 吗？这两个不等吗？ [/quote]  你的ptr是int类型的指针，所以+2移动的是两个int类型距离 而torf 是数组类型，+2移动的是两个这种类型数组的距离[/quote]  是不是如果定义为： int *ptr[2]; 这样的话，ptr +2 = &torf [2] . [/quote]  int *ptr[2]; 是一个指针数组，int (*ptr)[2] 才是指向数组的指针[/quote]  对，丢了个(); int (*ptr)[2]; 这样的话，ptr +2 = &torf [2] 。这个表达式是没问题的吧。[/quote]  如果：  int torf [2][2] = {12, 14,16}; int (*ptr)[2] = torf;  那么ptr + 2 与  &torf[2] 类型与值都是一样的

user: user-0
content: 引用 14 楼 paschen 的回复:[quote=引用 13 楼 login0201 的回复:] [quote=引用 12 楼 paschen 的回复:] [quote=引用 10 楼 login0201 的回复:] [quote=引用 9 楼 qq423399099 的回复:] torf +2才是你所谓的移动到第三行的第一列   大神讲全了哈。 可是ptf +2 不是等于 &torf[2] 吗？这两个不等吗？ [/quote]  你的ptr是int类型的指针，所以+2移动的是两个int类型距离 而torf 是数组类型，+2移动的是两个这种类型数组的距离[/quote]  是不是如果定义为： int *ptr[2]; 这样的话，ptr +2 = &torf [2] . [/quote]  int *ptr[2]; 是一个指针数组，int (*ptr)[2] 才是指向数组的指针[/quote]  对，丢了个(); int (*ptr)[2]; 这样的话，ptr +2 = &torf [2] 。这个表达式是没问题的吧。

user: user-1
content: 引用 13 楼 login0201 的回复:[quote=引用 12 楼 paschen 的回复:] [quote=引用 10 楼 login0201 的回复:] [quote=引用 9 楼 qq423399099 的回复:] torf +2才是你所谓的移动到第三行的第一列   大神讲全了哈。 可是ptf +2 不是等于 &torf[2] 吗？这两个不等吗？ [/quote]  你的ptr是int类型的指针，所以+2移动的是两个int类型距离 而torf 是数组类型，+2移动的是两个这种类型数组的距离[/quote]  是不是如果定义为： int *ptr[2]; 这样的话，ptr +2 = &torf [2] . [/quote]  int *ptr[2]; 是一个指针数组，int (*ptr)[2] 才是指向数组的指针