YiMingC 发表于 2019-5-6 21:19:26

26课课后题

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

char a = {
      {
                {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
      },
      {
                {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
      },
      {
                {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
      },
      {
                {'s', 't'}, {'u', 'v'}, {'w', 'x'}
      }
};
char (*pa) = &a;
char (*ppa) = &a;


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

对于pa的表达式,答案给出的是*(*(pa+8)+1),这个答案我可以理解。
我自己写的答案是(*(*(&pa+2)+2)+1),不知道这个答案是否可行:我想先改变它对应的跨度,再进行加减,麻烦大家帮忙看看。

jackz007 发表于 2019-5-6 21:57:00

#include <stdio.h>

int main(void)
{
      char a = {
                  {{'a' , 'b'} , {'c' , 'd'} , {'e' , 'f'}} ,
                  {{'g' , 'h'} , {'i' , 'j'} , {'k' , 'l'}} ,
                  {{'m' , 'n'} , {'o' , 'p'} , {'q' , 'r'}} ,
                  {{'s' , 't'} , {'u' , 'v'} , {'w' , 'x'}}
                  }                                       ;
      char (* pa) = & a                        ;
      char (* ppa) = & a                         ;
      printf("%c - %c\n" , pa , ppa)       ;
}

人造人 发表于 2019-5-6 22:24:47

"我自己写的答案是(*(*(&pa+2)+2)+1),不知道这个答案是否可行"

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

ba21 发表于 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) 又是何意? pa 指向一个含有2个元素的数组

其他的解释起来说不完。自己慢慢理解吧

人造人 发表于 2019-5-6 22:32:05

还有,你想知道(*(*(&pa+2)+2)+1)是不是可行,你试一试就知道了
“试一试”很重要,你试一试又不会弄坏些什么,到是可以证明些什么

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

int main(void)
{
        char a = {
                {
                        {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
                },
                {
                        {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
                },
                {
                        {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
                },
                {
                        {'s', 't'}, {'u', 'v'}, {'w', 'x'}
                }
        };
        char (*pa) = &a;
        printf("%c\n", (*(*(&pa+2)+2)+1));
        return 0;
}

YiMingC 发表于 2019-5-7 09:32:00

我是这样想的,pa现在指向的是{'g', 'h'}整体的地址,也是a[1]的首地址,对pa取地址是想把
       {
                {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
      }
看做一个整体,这样跨度就改变了,再进行加减操作。之前在甲鱼老师的课上见到过一次对首地址取地址来表示整体的例子,不知道这里可不行...在上课,待会回去我自己再试试...

人造人 发表于 2019-5-7 12:13:04

YiMingC 发表于 2019-5-7 09:32
我是这样想的,pa现在指向的是{'g', 'h'}整体的地址,也是a[1]的首地址,对pa取地址是想把
       {
...

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

int main(void)
{
        char a = {
                {
                        {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
                },
                {
                        {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
                },
                {
                        {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
                },
                {
                        {'s', 't'}, {'u', 'v'}, {'w', 'x'}
                }
        };
        char (*pa) = &a;
        printf("%.8x\n", &pa);
        printf("%.8x\n", &a);
        return 0;
}

YiMingC 发表于 2019-5-7 16:19:49

好吧 原来是这样 谢谢啦~
页: [1]
查看完整版本: 26课课后题