C primer plus 练习题问题

lq0201 2016-10-18 10:44:02
[size=14px]题目:
在下列代码中,*ptr 和 *(ptr + 2) 的值分别是什么?
int *ptr;
int torf[2][2] = {12, 14,16};
ptr = torf[0];


答案:12和16


疑惑:*ptf = 12 可以理解,但是*(ptr + 2) = 16有点困惑。
这是一个2行2列的二维数组,ptr+2 应该等于 &torf[2]
可是 &torf[2] 已经超出这个数组范围了吧?为何还能得到等于16值?
属于自学C语言,还请论坛里各位前辈和老师指教,谢谢!
...全文
238 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2016-10-19
  • 打赏
  • 举报
回复
ptr = torf[0]; ———————— *ptr == ptr[0] == torf[0][0] *(ptr + 2) == ptr[2] == torf[0][2]
赵4老师 2016-10-19
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 仅供参考:
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
赵4老师 2016-10-19
  • 打赏
  • 举报
回复
A[B]
*(A+B)
*(B+A)
B[A]
//以上四行等价

"abc"[1]
*("abc"+1)
*(1+"abc")
1["abc"]
//以上四行等价

A[0]
*(A)
0[A]
//以上三行等价
issac_gang 2016-10-19
  • 打赏
  • 举报
回复
你说的是对的,但是数组的内存是连续的,还是可以读出来的,如果你输出下 *(ptr+3)就会发现区别了。
ooolinux 2016-10-19
  • 打赏
  • 举报
回复
引用 8 楼 zaidaoshinima 的回复:
没搞懂 你这个二维数组少了一个啊,少的那个自动用0替代吗?
数组部分初始化的,没有初值的部分赋0,如果没有记错的话。
Buuuuuuu 2016-10-19
  • 打赏
  • 举报
回复
没搞懂 你这个二维数组少了一个啊,少的那个自动用0替代吗?
paschen 2016-10-19
  • 打赏
  • 举报
回复
你的p是int类型的指针,所以加2移动的距离不是数组的距离,而是一个int元素的距离 torf[2][2] 实际是4个连续的int,所以 *(ptr + 2) 指向的是其中的第三个
ooolinux 2016-10-19
  • 打赏
  • 举报
回复
引用 6 楼 u010165006 的回复:
[quote=引用 5 楼 u010165006 的回复:] ptr = torf[0]; ———————— *ptr == ptr[0] == torf[0][0] *(ptr + 2) == ptr[2] == torf[0][2]
torf[0][2] 实际上越界了,不过int torf[2][2] = {12, 14,16}; 这个二维数组是按行连续存储的,所以 torf[0][2] == torf[1][0] (列满了就进一行,或者把二维数组当做一维来看,它们是同一个) [/quote] 把二维数组当做一维来看,比如数组int a[5][10] 对应 int b[5x10],那么 a[i][j] 对应 b[ i*10+j ]
ooolinux 2016-10-19
  • 打赏
  • 举报
回复
引用 5 楼 u010165006 的回复:
ptr = torf[0]; ———————— *ptr == ptr[0] == torf[0][0] *(ptr + 2) == ptr[2] == torf[0][2]
torf[0][2] 实际上越界了,不过int torf[2][2] = {12, 14,16}; 这个二维数组是按行连续存储的,所以 torf[0][2] == torf[1][0] (列满了就进一行,或者把二维数组当做一维来看,它们是同一个)
帕奇笔记 2016-10-18
  • 打赏
  • 举报
回复
torf[0][0],torf[0][1],torf[1][0],torf[1][1] 地址连续,你用指针访问相当于访问第三个数据。 torf[1][0],因此是16.

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧