鱼C论坛

 找回密码
 立即注册
查看: 1870|回复: 7

[已解决]26课课后题

[复制链接]
发表于 2019-5-6 21:19:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第26课测试题原题如下:
5. 定义以下变量:

  1. char a[4][3][2] = {
  2.         {
  3.                 {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
  4.         },
  5.         {
  6.                 {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
  7.         },
  8.         {
  9.                 {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
  10.         },
  11.         {
  12.                 {'s', 't'}, {'u', 'v'}, {'w', 'x'}
  13.         }
  14. };
  15. char (*pa)[2] = &a[1][0];
  16. char (*ppa)[3][2] = &a[1];
复制代码



想要通过指针 pa 和 ppa 访问数组 a 中的 'x' 元素,请问表达式应该怎么写?

对于pa的表达式,答案给出的是*(*(pa+8)+1),这个答案我可以理解。
我自己写的答案是(*(*(&pa+2)+2)+1),不知道这个答案是否可行:我想先改变它对应的跨度,再进行加减,麻烦大家帮忙看看。
最佳答案
2019-5-7 12:13:04
YiMingC 发表于 2019-5-7 09:32
我是这样想的,pa现在指向的是{'g', 'h'}整体的地址,也是a[1]的首地址,对pa取地址是想把
       {
  ...

但是&pa和&a[1]是不一样的,&pa是变量pa的地址,&a[1]是a[1]的地址
&pa和&a[1]是不一样的
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char a[4][3][2] = {
  5.                 {
  6.                         {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
  7.                 },
  8.                 {
  9.                         {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
  10.                 },
  11.                 {
  12.                         {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
  13.                 },
  14.                 {
  15.                         {'s', 't'}, {'u', 'v'}, {'w', 'x'}
  16.                 }
  17.         };
  18.         char (*pa)[2] = &a[1][0];
  19.         printf("%.8x\n", &pa);
  20.         printf("%.8x\n", &a[1]);
  21.         return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-6 21:57:00 | 显示全部楼层
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char a[4][3][2] = {
  5.                   {{'a' , 'b'} , {'c' , 'd'} , {'e' , 'f'}} ,
  6.                   {{'g' , 'h'} , {'i' , 'j'} , {'k' , 'l'}} ,
  7.                   {{'m' , 'n'} , {'o' , 'p'} , {'q' , 'r'}} ,
  8.                   {{'s' , 't'} , {'u' , 'v'} , {'w' , 'x'}}
  9.                   }                                         ;
  10.         char (* pa)[2] = & a[1][0]                          ;
  11.         char (* ppa)[3][2] = & a[1]                         ;
  12.         printf("%c - %c\n" , pa[8][1] , ppa[2][2][1])       ;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-6 22:24:47 | 显示全部楼层
"我自己写的答案是(*(*(&pa+2)+2)+1),不知道这个答案是否可行"

(*(*(&pa+2)+2)+1)不对,pa不应该取地址
你现在不需要纠结这类问题,指针,你也知道的,貌似是C语言中最重要的一个组件了,哪有那么容易掌握,你现在能看懂类似pa + 1、pa - 5这类简单的指针运算就行了,继续往后走,把整个系列学完后,开始学汇编语言,之后带着汇编语言来深入理解指针
带着汇编语言来纠结(*(*(&pa+2)+2)+1)这类复杂的指针运算
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-6 22:30:31 | 显示全部楼层
你代码上机不就知道行不行了。
&pa ,pa是一个数组指针,   然后,你&pa 取数组指针的地址来操用是何意?没点意义啊。

再看
*(*(pa+8)+1)
pa 是一个数组指针
pa+8 表示跨 8行
*(pa+8) 然后取得第8行第0号元素的地址
*(pa+8)+1 再然后,第8行第0号地址加1,也就是第8行第1号元素的地址
*(*(pa+8)+1) 取得第8行第1号元素的值


数组指针,何为数组指针,意思就是它是一个指针,指向的是一个数组。
char (*pa)[2] 又是何意? pa 指向一个含有2个元素的数组

其他的解释起来说不完。自己慢慢理解吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-6 22:32:05 | 显示全部楼层
还有,你想知道(*(*(&pa+2)+2)+1)是不是可行,你试一试就知道了
“试一试”很重要,你试一试又不会弄坏些什么,到是可以证明些什么

“试一试”很重要
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char a[4][3][2] = {
  5.                 {
  6.                         {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
  7.                 },
  8.                 {
  9.                         {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
  10.                 },
  11.                 {
  12.                         {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
  13.                 },
  14.                 {
  15.                         {'s', 't'}, {'u', 'v'}, {'w', 'x'}
  16.                 }
  17.         };
  18.         char (*pa)[2] = &a[1][0];
  19.         printf("%c\n", (*(*(&pa+2)+2)+1));
  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 09:32:00 From FishC Mobile | 显示全部楼层
我是这样想的,pa现在指向的是{'g', 'h'}整体的地址,也是a[1]的首地址,对pa取地址是想把
       {
                {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
        }
看做一个整体,这样跨度就改变了,再进行加减操作。之前在甲鱼老师的课上见到过一次对首地址取地址来表示整体的例子,不知道这里可不行...在上课,待会回去我自己再试试...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-7 12:13:04 | 显示全部楼层    本楼为最佳答案   
YiMingC 发表于 2019-5-7 09:32
我是这样想的,pa现在指向的是{'g', 'h'}整体的地址,也是a[1]的首地址,对pa取地址是想把
       {
  ...

但是&pa和&a[1]是不一样的,&pa是变量pa的地址,&a[1]是a[1]的地址
&pa和&a[1]是不一样的
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char a[4][3][2] = {
  5.                 {
  6.                         {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
  7.                 },
  8.                 {
  9.                         {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
  10.                 },
  11.                 {
  12.                         {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
  13.                 },
  14.                 {
  15.                         {'s', 't'}, {'u', 'v'}, {'w', 'x'}
  16.                 }
  17.         };
  18.         char (*pa)[2] = &a[1][0];
  19.         printf("%.8x\n", &pa);
  20.         printf("%.8x\n", &a[1]);
  21.         return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 16:19:49 From FishC Mobile | 显示全部楼层
好吧 原来是这样 谢谢啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 18:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表