c - 我想了解一些关于这段代码的信息

标签 c

谁能帮我解释一下这段代码为什么这段代码的结果是“1 1 3”

#include <stdio.h>
#include <stdlib.h>


int main()
{
    static int a[]={1,3,2,3,4};
    int *p[]={a,a+1,a+2,a+3,a+4};
    int **ptr=p;
    ptr++;
    printf("\n%d %d %d\n",ptr-p,*ptr-a,**ptr);
    return 0;
}

最佳答案

如果您想了解更多信息,可以查找“指针算术”和/或我的答案不会有帮助。

说明:

int *p[]={a,a+1,a+2,a+3,a+4}; 用指向的指针填充数组 p数组a中的每个元素。它相当于int *p[]={&a[0],&a[1],&a[2],&a[3],&a[4]}p[0] 指向 a[0]p[1] 指向 a[1] 并且等等。

int **ptr=p; 然后创建指向数组 p 开头的指针。即相当于int **ptr=&p[0];

ptr++ 递增 ptr,以便它指向下一个元素。在这种情况下,结果与 ptr = &p[1]; 相同。

然后,打印数字时:

减去指针(指针算术)意味着结果等于两个操作数之间可以容纳的元素数量。因为您之前增加了 ptr 行,所以它们正好相距 1 个元素(即 sizeof(int *))。 ptr 指向 p[1]p 指向 p[0]

*ptr - a 也是如此,它们相距 1 个元素(仅在这种情况下,它是 sizeof(int))。 *ptr(即p[1])指向a[1]a指向a[0]

ptr指向p[1],它指向a[1],也就是3,因此 **ptr3

代码警告:

正如 David Bowling 所指出的,printf 语句对提供的参数使用了错误的格式说明符。由于指针减法的结果,例如 ptr-p,其类型为 ptrdiff_t,正确的格式说明符为 %td: printf( "\n%td %td %d\n",ptr-p,*ptr-a,**ptr);

使用 %d 说明符与 int 类型一起使用,与不正确的类型一起使用时会导致未定义的行为。

您可以查看对哪些类型使用哪些说明符,例如:http://www.cplusplus.com/reference/cstdio/printf/

关于c - 我想了解一些关于这段代码的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45701591/

相关文章:

比较 int 和 unsigned int

C externs 别名相同的地址?

c - 在不使用 AUTOCONF 的情况下,如何找出 C 编译器 : inline, __inline__ 或 __inline 支持哪些说明符(如果有)?

c++ - 如何将 unsigned Short 数组转换为 int 数组?

c++ - 推荐一个 c++ 库来处理 http

c - 将输入放入数组c程序中

c - C函数调用Yoda的Pwnge

c - exec ftp -vn 系统返回错误

c - 如何在PAM应用程序中捕获密码

c - 对两个 float4[] 数组求和,而不是 int[] 数组(代码更改)