c 指针和数组指针

标签 c arrays pointers

我在网上看到了这段代码。我根本不明白这里发生了什么。

#include <stdio.h>
#include <math.h>

main()
{
    int arr [ ][3] = {{11,12,13}, {21,22,23},{31,32,33},{41,42,43},{51,52,53}};
    int I , j ;
    int  *p ,  (*q) [3], *r ;
    p = (int *) arr ;
    q = arr;
    r = (int *) q ;
    printf ("  %u  %u  %d  %d  %d  %d \n  ", p, q, *p, *(r), *(r+1), *(r+2));
    p++ ;
    q++ ;
    r = (int *) q ;
    printf ("  %u  %u  %d  %d  %d  %d \n  ", p, q, *p, *(r), *(r+1), *(r+2));
}

我知道 p 和 r 是指针,q 是指向数组的指针,但是 p = (int *) arr ; 是什么意思?是什么意思?这句话的目的是什么?

最佳答案

表达式中的

arr 被隐式转换为指向其第一个元素的指针。由于 arr 的元素具有 int[3] 类型,因此 arr 会转换为 int ( * )[3] >

下面的代码片段演示了这种隐式转换

int  (*q) [3];

q = arr;

声明

 p = (int *) arr;

表示像int *一样转换后重新解释int ( * )[3]类型的arr

arr 之前的

( int * ) 表示所谓的强制转换,即重新解释。

现在二维数组arr占用的内存被重新解释为类型为int [15]p<的一维数组占用的内存 指向这个虚构数组的第一个元素。

关于c 指针和数组指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327750/

相关文章:

c - 正在做 (ptr && *ptr) 检查是否有任何值分配给 ptr 的好方法?我的一直崩溃

c++ - 在 C++ 中分离声明和初始化

c - 这是正确的还是有更好的方法?

java - 如何在插入排序中保持数据配对

java - 无法创建内部类数组

c# - 重新排序将空值放在 C# 末尾的数组

c++ - 在类文件中包装 ZMQ C++ 时出错

c - C程序中缺少开关盒

c - 为什么 printf ("%s",charstr) 每次 fread() 的打印量越来越多?

c - 指针数组中不兼容类型的赋值 (c)