Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 解引用指向二维数组的指针_Arrays_C_Pointers - Fatal编程技术网

Arrays 解引用指向二维数组的指针

Arrays 解引用指向二维数组的指针,arrays,c,pointers,Arrays,C,Pointers,我不明白为什么在取消对数组指针的引用时,结果是数组第一个值的地址 int array[2][2] = {{0,1},{0,1}}; int (*p)[2]; p = array; 我知道p是指向2个整数数组的指针,而不是指向整数的指针。但是如果我们打印出p的值,它仍然是一个整数的地址。我想知道引擎盖下面发生了什么?p是指向指针数组的指针吗?所以我们必须去引用它两次才能得到它所指向的整数的值 指向int的指针 int* p; 是一个存储在某个位置的变量,其中包含另一个变量(int)的地址

我不明白为什么在取消对数组指针的引用时,结果是数组第一个值的地址

int array[2][2] = {{0,1},{0,1}}; 
int (*p)[2];
p = array;

我知道p是指向2个整数数组的指针,而不是指向整数的指针。但是如果我们打印出p的值,它仍然是一个整数的地址。我想知道引擎盖下面发生了什么?p是指向指针数组的指针吗?所以我们必须去引用它两次才能得到它所指向的整数的值

指向int的指针

int* p;
是一个存储在某个位置的变量,其中包含另一个变量(int)的地址

当我们取消引用它时,我们得到该变量的值。使用指向数组的指针,这个过程是如何工作的

  • 可以使用
    访问数组中的值
    array[i]=*(array+i)
    (扩展
    [i]

  • 同样地,
    (*p)[i]=*(*(p+i))
    。因此,我们需要解引用两次才能访问值

  • 如果要访问,
    数组[0][0]
    ,必须使用
    *(*(p+0)+0)=**p,,
    类似地,可以使用
    *(*(p+0)+1)=*(*p)+1)访问
    数组[0][1]

  • 注意,
    *p
    指向第一行(存储
    数组[0][0]
    )的地址,
    *(p+1)
    指向第二行(存储
    数组[1][0]

  • 请检查以下代码:

    #include <stdio.h>
    int main()
    {
        int array[2][2] = {{1, 2}, {3, 4}};
        int(*p)[2];
        p = array;
    
    
        printf("The address of array[0][0] is %p \n",&array[0][0]);
        printf("The address of *p is %p \n",*p);
    
        printf("The address of array[1][0] is %p \n",&array[1][0]);
        printf("The address of *(p+1) is %p \n",*(p+1));
    
        printf("The value of array[0][0] is %d \n",array[0][0]);
        printf("The value of **p is %d \n",**p);
    
        printf("The value of array[0][1] is %d \n",array[0][1]);
        printf("The value of *((*p)+1) is %d \n",*((*p)+1));
    
    
        return 0;
    }
    
    数组的地址与其第一个元素的地址相同。 给定定义
    int数组[2][2]={{0,1},{0,1},编译器在内存中安排一些位置以包含
    int
    值0、1、0和1。假设位置有地址1000,
    int
    值0存储在字节1000-1003中,1存储在1004到1007中,0存储在1008到1011中,1存储在1012到1015中

    元素
    数组[0][0]
    在内存中从何处开始?在1000号位置

    数组
    数组
    在内存中从何处开始?在1000号位置

    数组
    数组[0]
    在内存中从何处开始?在1000号位置

    数组在内存中的起始位置与其第一个元素在内存中的起始位置相同。另外,
    数组[0]
    本身就是一个数组,从位置1000开始

    因此,在
    p=array之后
    p
    指向位置1000。元素
    数组[0][0]
    也从位置1000开始。因此,当您打印
    p
    时,就像打印f一样(“%p\n”((void*)p)数组[0][0]
    的地址时,您会得到与打印
    printf(“%p\n”,(void*)和数组[0][0])相同的结果,这并不奇怪

    数组将自动转换为其第一个元素的地址。

    接下来,让我们考虑<代码> *P<代码>。

    p
    的类型是
    int(*)[2]
    ,一个指向2
    int
    数组的指针。因此,
    *p
    是一个2
    int
    的数组

    尤其是,
    *p
    是一个数组。假设我们试图通过将它作为参数传递给
    printf
    来打印它。会发生什么

    在C语言中,当在表达式中使用数组时,它会自动转换为其第一个元素的地址(除非数组是
    sizeof
    或一元
    &
    的操作数,或者是用于初始化数组的字符串文字)。因此,如果使用
    *p
    作为
    printf
    的参数,它最初的意思是
    数组[0]
    ,但该数组被转换为其第一个参数的地址。因此,将
    *p
    作为参数传递实际上是传递
    &数组[0][0]
    (或者,相当于
    &(*p)[0]


    因此,
    printf(“%p\n”,(void*)*p)
    将打印与
    printf(“%p\n”((void*)和a[0][0])相同的地址

    对于与
    p=array不兼容的指针类型的赋值,您的警告说明了什么<代码>整数(*p)[2]是合适的。好的,我刚刚纠正了它。当谈到数组及其与指针的关系时,有两件事需要记住。第一个是数组本身衰减为指向其第一个元素的指针。这意味着
    数组
    数组[0]
    完全相同。第二件事是,对于任何数组或指针
    array
    和索引
    i
    ,表达式
    array[i]
    完全等于
    *(array+i)
    。2D数组是由1D数组组成的数组
    p
    指向
    array
    中的第一个1D数组。因此
    p
    指向
    array[0]
    p+1
    指向
    array[1]
    。访问时调用数组将转换为指向其第一个元素的指针。因此
    *p
    将指向第一行的第一个元素(它与
    *(p+0)
    相同,后者与
    p[0]
    相同),在处理数组和指针时,我建议您在纸上绘制它们。使用正方形表示单变量,使用矩形表示数组(除以以显示元素),使用箭头表示指针。它通常有助于了解事物的概况。
    #include <stdio.h>
    int main()
    {
        int array[2][2] = {{1, 2}, {3, 4}};
        int(*p)[2];
        p = array;
    
    
        printf("The address of array[0][0] is %p \n",&array[0][0]);
        printf("The address of *p is %p \n",*p);
    
        printf("The address of array[1][0] is %p \n",&array[1][0]);
        printf("The address of *(p+1) is %p \n",*(p+1));
    
        printf("The value of array[0][0] is %d \n",array[0][0]);
        printf("The value of **p is %d \n",**p);
    
        printf("The value of array[0][1] is %d \n",array[0][1]);
        printf("The value of *((*p)+1) is %d \n",*((*p)+1));
    
    
        return 0;
    }
    
    The address of array[0][0] is 0x7fff6e8781a0 
    The address of *p is 0x7fff6e8781a0 
    The address of array[1][0] is 0x7fff6e8781a8 
    The address of *(p+1) is 0x7fff6e8781a8 
    The value of array[0][0] is 1 
    The value of **p is 1 
    The value of array[0][1] is 2 
    The value of *((*p)+1) is 2