表达式-c语言中的printf函数问题

问题描述

c语言中的printf函数问题

int main()
{
int arry[3][5]={
{1,2,4},
{4,5,6,7},
{6,5,3,8}
};
int (*p)[5];
p=arry;

    printf("%xn",*(p+1)+3);
    printf("%xn",*(*(p+1)+3));
    printf("%xn",*(p+1)+3);
    printf("%xn",*(p+1)+2);
    printf("%xn",p);
    printf("%xn",p+1);
    printf("%xn",*p+1);
    printf("%xn",p[0]+1);
    printf("%xn",**p);
    printf("%xn",&p);

    定义了一个二维数组arry,printf("%xn",*(p+1)+3);为什么这样输出来的是一个地址?
    其中printf函数中的输出项表,到底是不是在计算表达式的左值还是右值,如果是的
    话,到底是哪个值? 谢谢解决问题

解决方案

再解决该问题之前,想讲一下,定义一个指针的语句,代表的含义.

接下来,根据这个题来讲.

int main()

{
int arry[3][5]={{1,2,4},{4,5,6,7},{6,5,3,8}};//数组名代表的是一块内存的首地址
int (*p)[5];//定义一个数组指针.这个指针,指向一个一维数组的首地址.该一维数组含有5个成员.可以把这条语句理解成int5;那么指针p指向的是一个int[5] 类型,p的寻址能力是sizeof(int)*5. p+1指向的地址和p指向的地址相差20. 在二维图中,(p+1)就到下一行.
//在一些参考书中,把*(星号)解释成降低维度(降维).本来p是指向int型数组的指针.用星号降维之后,(*p)就是一个int型的指针.那么(*p)+1,就是往后移动了sizeof(int)个字节,就是4个字节.记住,现在(*p)还依然是一块内存地址.
p=arry;//p指向数组arry的首地址
printf("%xn",*(p+1)+3);//在附加的参考图中,p指向0XFFFF0002,p是一个int[5]类型的指针,所以,p+1往后移动sizeof(int)*5个字节,也就是移动到第二行,p+1就是第二行的首地址.*(p+1)就是降维,接下来如果再移动,就是移动sizeof(int)个字节.切记,这时候*(p+1)仍然是一个地址,*(p+1)并不是取(p+1)这个地址的值.因为p一开始指向的是一个数组,所以,这时候的星号只是降维.现在*(p+1)是一个地址了,也可以理解为是一个int型的指针了.如果再进行取值,那么就是一个数值.例如:*(*(p+1)+0)是第二行第一个的值, ((p+2)+4)是第三行第五个的值.
printf("%xn",*(*(p+1)+3));//第二行第三个的值
printf("%xn",*(p+1)+3);//第二行第四个的地址
printf("%xn",*(p+1)+2);//第二行第三个的地址
printf("%xn",p);//数组的首地址,也是第一行的首地址,也是第一行第一个元素的首地址.
printf("%xn",p+1);//第一行第二个元素的首地址.p是一个int[5]类型的指针,所以你要承认,(p+1)仍然是一个int[5]类型的指针,并不是int型的指针,所以,要先用星号对它进行降维,才是int型的指针.然后才可以使用星号取这个地址的值.
printf("%xn",*p+1);//第一行第二个元素的地址.
printf("%xn",p[0]+1);//p[0]相当于*(p+0).所以,这个是第一行第二个元素的地址.在这里再多讲一点数组方式访问和星号方式访问的转换.*(p+0)和p[0]相同,*(p+3)+2和p[3]+2相同,p[2][3]和*(*(p+2)+3)相同.
printf("%xn",**p);//第一行第一个元素的值.
printf("%xn",&p);//p是一个指针变量,p在内存中也有一个存储它的空间.这句话就是输出存放变量p的内存地址.

}


我猜你可以这么想:
你如果不能理解,你可能会说:”p是一个内存地址,那么*p就该是取这块内存地址中存放的值”.那么,我们拿上面这个题为例,定义p的时候是这样定义的.int (*p)[5];然后,请你告诉我如果访问第一行第三个空间的值?是*(p+2)吗?如何访问第三行第二个空间的值?是*(p+11)吗?拜托大哥,如果你想这样访问的话,你定义指针变量p的时候,可以这样定义,int *p=arry;那么,你就可以尽情的通过*(p+11)访问到第三行第二个空间的值了.

解决方案二:

(p+1)+3)是不是应该是((p+1)+3)

解决方案三:

*(p+1)得到的是一个指针,指针+3的结果当然是一个地址

解决方案四:

printf函数可以显示输出,,也可以打印值 ,后面的是打印的值

解决方案五:

p 的类型是:int (*)[5]
p 的类型是:int
**p 的类型才是 : int

你们都乱猜什么

解决方案六:

根据Ollydbg调试得到:


运行结果:

解决方案七:

(p+1)+3),这样 加一个*号就好了。详情见 高级程序语言c版

解决方案八:

更正Allblues57的长篇回答。。

p[1]指向arry[1][0]而不是arry[1]。

求解**p时,p指向arry[0],即p=&arry[0];*p=arry[0]; **p=arry[0][0];

时间: 2025-01-02 19:54:46

表达式-c语言中的printf函数问题的相关文章

编程c语言-CC语言中的main函数中的参数

问题描述 CC语言中的main函数中的参数 就是int argc char *argv[ ] 这个是什么意思,怎么样进行传参的,求大神指点迷津... 解决方案 C编译器允许main()函数没有参数,或者有两个参数(有些实现允许更多的参数,但这只是对标准的扩展).这两个参数,一个是int类型,一个是字符串类型.第一个参数是命令行中的字符串数.按照惯例(但不是必须的),这个int参数被称为argc(argument count).大家或许现在才明白这个形参为什么要取这么个奇怪的名字吧,呵呵!至于英文

有关于c语言中的getch函数

问题描述 有关于c语言中的getch函数 getch函数为什么对Ctrl或者alt之类的键没有反应??要想键盘随意按下一个键,就能进入程序,用什么函数?? 解决方案 getch是按键位分区来获取值的,就比如按下方向键会得到两个数,需要两次getch才能取完,如果有些按键是转意符,可以通过判断key键是否处于按下状态来确定. 解决方案二: getchar 函数名: getchar 功 能: 从stdio流中读字符 用 法: int getchar(void); 注解: getchar有一个int型

c语言中的system函数问题

问题描述 c语言中的system函数问题 在代码里面用system 函数 打开某一程序,结果导致打开这一程序后,下面的system函数用不了 . 请看图.......... 解决方案 求大神啊!!!!!!!!!!!!!!!!!!!! 解决方案二: system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait.h> #include <errno.h>

c语言-C语言中的u2f函数在哪个库里面?

问题描述 C语言中的u2f函数在哪个库里面? 本人大二,在学计算机系统基础,有一道题要用u2f函数,但是不知道在哪个库里面, 不知道有谁了解? (u2f函数:将一个无符号整数表示的0/1序列作为float类型返回) 解决方案 自己做一个,下面认为 unsigned 和float 长度一致 比如 float u2f(unsigned u) { return * (float*)&u; } 或者 float u2f(unsigned u0) { union{ unsigned u; float f;

C语言中的strdup()函数和其与strcpy()函数的区别_C 语言

头文件: #include <string.h> 定义函数: char * strdup(const char *s); 函数说明:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回.该地址最后可以利用free()来释放. 返回值:返回一字符串指针,该指针指向复制后的新字符串地址.若返回NULL 表示内存不足. 范例 #include <string.h> main(){ char a[] = &

C语言中的pause()函数和alarm()函数以及sleep()函数_C 语言

C语言pause()函数:让进程暂停直到信号出现头文件: #include <unistd.h> 定义函数: int pause(void); 函数说明:pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断. 返回值:只返回-1. 错误代码:EINTR 有信号到达中断了此函数. C语言alarm()函数:设置信号传送闹钟头文件: #include <unistd.h> 定义函数: unsigned int alarm(unsigned int sec

C语言中的fscanf()函数与vfscanf()函数使用_C 语言

C语言fscanf()函数:输入函数(比较常用)头文件: #include <stdio.h> 定义函数: int fscanf(FILE * stream, const char *format, ...); 函数说明:fscanf()会自参数stream 的文件流中读取字符串, 再根据参数format 字符串来转换并格式化数据.格式转换形式请参考scanf(). 转换后的结构存于对应的参数内. 返回值:成功则返回参数数目, 失败则返回-1, 错误原因存于errno 中. 范例 #inclu

C语言中的abs()函数和exp()函数的用法_C 语言

C语言abs()函数:求绝对值(整数)头文件: #include <stdlib.h> 定义函数: int abs (int j); 函数说明:abs()用来计算参数j 的绝对值,然后将结果返回. 返回值:返回参数j 的绝对值结果. 范例 #ingclude <stdlib.h> main(){ int ansert; answer = abs(-12); printf("|-12| = %d\n", answer); } 执行 |-12| = 12 C语言ex

使用C语言中的time函数获取系统时间_C 语言

可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算.其原型为:time_t time(time_t * t);如果你已经声明了参数t,你可以从参数t返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数.如果参数为空(NULL),函数将只通过返回值返回现在的日历时间,比如下面这个例子用来显示当前的日历时间: 复制代码 代码如下: #i