哪位好心人帮我解答一下

Figowt 2012-09-26 11:48:17
#include<stdio.h>
void main(){
int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int **pmap = map;
printf("%d\n",pmap[4]);

}


疑问是 pmap是指向指针的指针,对它进行一次解引用,应该是地址,为什么答案是5呢?

求好心人
...全文
204 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyrack 2012-09-27
  • 打赏
  • 举报
回复
弱弱的问下 int **n=NULL;
n++的话是加多少?
Gloveing 2012-09-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include<stdio.h>
void main()
{
int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int *pmap = (int *)map;
printf("%d\n",pmap[4]);

int **pmap2 = (int **)map;
printf("%d\n",pmap2[4]);

}

输出:
5
5
Press any key to continue

理解这两个输出
whdugh 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
C/C++ code

#include <stdio.h>
#include<stdio.h>
void main()
{
int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int *pmap = (int *)map;
printf("%d\n",pmap[4]);

int **pmap2 = (int ……
[/Quote]我怎么还是很不理解
ForestDB 2012-09-27
  • 打赏
  • 举报
回复
这里打出的是9。
其实你打的只是个地址。
开debugger。
AnYidan 2012-09-27
  • 打赏
  • 举报
回复
在 int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};后设断点,watch "map", "*map", "*(map + 1)"...
huangwenshen 2012-09-27
  • 打赏
  • 举报
回复
pmap[4] 相当于 pamp+4 。这个问题的关键是指针移动幅度的问题。因为pamp的类型是指针,故一次移动的是4个字节。正好移动到5的内存地址处。再例如:map+1,map现在的单位一个包含三位数据的一维数组,移动3个int,故打印的是4。

其实如果不明白的,可以用调试查看内存地址的变化。将数据类型换为char更为明显。
zhaoming262350 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
#include<stdio.h>
void main(){
int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int **pmap = map;
printf("%d\n",pmap[4]);

}


疑问是 pmap是指向指针的指针,对它进行一次解引用,应该是地址,为什么答案是5呢?

求好心人
[/Quote]

** pmap是指向指针,形式是这样的 *(*pmap),指向指针用的是“二级间址” 的方法,即第一个指针指向相应的元素的地址,然后再指向该地址的所指的值
输出的结果是5
dushun1000 2012-09-27
  • 打赏
  • 举报
回复
int **pmap = map;应该编译不过的,如果编译过了,就是map强制转换为(int**),即int **pmap = (int**)map;即pmap=map,那pmap[4]对应位置就是map+4位置上的值。这个位置上就是5
赵4老师 2012-09-27
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是很多数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
天亮后说晚安 2012-09-27
  • 打赏
  • 举报
回复
*pmap 相当于map

[Quote=引用 9 楼 的回复:]
这个知道的,但
int **pmap = map;
printf("%d\n",pmap[4]);



引用 4 楼 的回复:

在 int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};后设断点,watch "map", "*map", "*(map + 1)"...
[/Quote]
Figowt 2012-09-27
  • 打赏
  • 举报
回复
这个知道的,但
int **pmap = map;
printf("%d\n",pmap[4]);


[Quote=引用 4 楼 的回复:]

在 int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};后设断点,watch "map", "*map", "*(map + 1)"...
[/Quote]
Figowt 2012-09-27
  • 打赏
  • 举报
回复

求详解
多谢了
[Quote=引用 2 楼 的回复:]

C/C++ code
#include <stdio.h>
#include<stdio.h>
void main()
{
int map[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int *pmap = (int *)map;
printf("%d\n",pmap[4]);

int **pmap2 = (int **)map;
……
[/Quote]
Figowt 2012-09-27
  • 打赏
  • 举报
回复
是5额。。。
[Quote=引用 5 楼 的回复:]

这里打出的是9。
其实你打的只是个地址。
开debugger。
[/Quote]
__phoenix 2012-09-26
  • 打赏
  • 举报
回复
双指针做二维数组用:
int **pmap;
for(int i=0;i<height;i++)
{
pmap[i]=new int[width];
}
//--初始化
for(int j=0;j<Height;j++)
for(int k=0;k<widht;k++)
{
*(pmap[j]+k)=map[j][k];
}

69,382

社区成员

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

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