这个问题如何分析,结果选什么呢

img

img

答案应该为D ,说明如下:


//创建一个二维字符数组,数组是2*3的字符数组。 
    //将字符指针p指向二维数组开头 
    char s[2][3] = {"ab","cd"},*p=(char *)s;
    
    //下面这个我有点不太确定是否正确
     //  s为一个单位为3个字符的字符指针 ,
    //*(s+3)为二维数组开始位置后第3个长度为3个字符的字符指针,这个是指针,不是字符。  
    printf("%c\n",*(s+3));
    
    //s[1][1] 指向二维数组开头后第(0+2*2)个字符的位置,字符串自带一个'\0'字符,即 'd'
    printf("%c\n",s[1][1]);
    
    // p为单位为一个字符的字符指针,p[1][1]语法错误。 
  //    printf("%c",p[1][1]);
    
    // p为单位为一个字符的字符指针, *(p+3)指向二维数组开头后第3(0+3)个字符 ,字符串自带一个'\0'字符,即'c' 
    printf("%c\n",*(p+3));
    
    //  p为单位为一个字符的字符指针,因为++运算符优先级高于*,所以先将p指针往后一个字符位置,即'b' 
    //然后因为*运算符 优先级高于+,所以第二步执行取p当前的值操作,即获得值b,然后字符'b'+2,即等于'd' 
    printf("%c\n",*++p+2);

回答有我看书的学习和我自己的理解,请审慎批判看到下面的回答,如果有错误,请见谅。

首先是几个单位的字符指针,
举例来说char s[2][3]的二维数组,这个可以把他想象成一个2行3列的字符数组,以后面的3列来断定s是3个字符组为单位的指针(每次移动一行,指向下一个3个字符组的指针起始位置),这里面的3个字符组又由一个字符指针来读取和存储,所以s是3个字符组的指针的指针,即二维数组变量就是指针的指针。

然后是判断指向几个字符位置,
这个s+3就是s指针往后移动3行(每一行的单位为3个字符组),*(s+3)即为指向往后移动3行的首字符起始位置(使用*就是让指针往下降一级,这里是降为一个字符指针了,不再是字符组的指针了,即不再是指针的指针)