C 取消引用二维的名称与名称相同。那么解引用做什么呢?

C 取消引用二维的名称与名称相同。那么解引用做什么呢?,c,pointers,C,Pointers,解引用的作用是什么? 它只是返回指针中地址的值吗 WIKI说“它对指针变量进行操作,并返回与指针地址处的值等效的l值” 我被下面的代码弄糊涂了: int p[2][2] = {1, 2, 3, 4}; printf("%p\t%p", p, *p); 我知道p是指向数组的指针,如下所示 int (*p)[2]; 假设p的地址为0x003DEF4C。那么*p不应该是0x003DEF4C中的值? 但它与p的值相同 因此,它喜欢取消引用,而不仅仅返回指针指向的地址值。wiki所说的是正确的,而且非

解引用的作用是什么? 它只是返回指针中地址的值吗

WIKI说“它对指针变量进行操作,并返回与指针地址处的值等效的l值”

我被下面的代码弄糊涂了:

int p[2][2] = {1, 2, 3, 4};
printf("%p\t%p", p, *p);
我知道p是指向数组的指针,如下所示

int (*p)[2];
假设p的地址为0x003DEF4C。那么*p不应该是0x003DEF4C中的值? 但它与p的值相同


因此,它喜欢取消引用,而不仅仅返回指针指向的地址值。

wiki所说的是正确的,而且非常简单。从一维数组开始

int p[4] = {1, 2, 3, 4};
printf("%p\t%d", (void *)p, *p);
p
转换为指向数组第一个元素的指针
p[]
。取消引用
p
将返回存储在
p
指向的地址处的值
*p
是一个l值,相当于变量
p[0]

以简单作业为例

p[0] = 5;         // In this assignment p[0] is a l-value
*p   = p[0] + 1;  // p[0] is r-value and *p is l-value 
p[0] = *p - 5;    // p[0] is l-value and *p is r-value 

在您的
printf
中,您要求:

  • p
    :二维数组的地址=数组第一个元素的地址
  • *p
    :一维子数组的地址=数组第一个元素的地址(与上面的地址相同)
请注意,如果您查看
(*p)[1]
的地址,例如(第二个子数组),您应该有一些不同的内容

解引用的作用是什么?它只是返回指针中地址的值吗

取消引用指针时,将获得指针指向的值

假设p的地址为0x003DEF4C。那么*p不应该是0x003DEF4C中的值?但它与p的值相同

对于您拥有的特定代码,这是正确的。看看和你的有点不同的东西

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

int main()
{
   int p1[2][2] = {1, 2, 3, 4};
   int* p2[2] = {NULL, NULL};
   int** p3 = NULL;
   int** p4 = NULL;

   p2[0] = (int*)malloc(2*sizeof(int));
   p2[1] = (int*)malloc(2*sizeof(int));
   p2[0][0] = 1;
   p2[0][1] = 2;
   p2[1][0] = 3;
   p2[1][1] = 4;

   p3 = (int**)malloc(2*sizeof(int*));

   p3[0] = (int*)malloc(2*sizeof(int));
   p3[1] = (int*)malloc(2*sizeof(int));
   p3[0][0] = 1;
   p3[0][1] = 2;
   p3[1][0] = 3;
   p3[1][1] = 4;

   p4 = (int**)malloc(4*sizeof(int));
   p4[0] = (int*)p4;
   p4[1] = p4[0]+2;
   p3[0][0] = 1;
   p3[0][1] = 2;
   p3[1][0] = 3;
   p3[1][1] = 4;

   printf("Address of p1:    %p\n", (void*)p1);
   printf("Address of p1[0]: %p\n", (void*)p1[0]);
   printf("Address of p1[1]: %p\n", (void*)p1[1]);
   printf("\n");

   printf("Address of p2:    %p\n", (void*)p2);
   printf("Address of p2[0]: %p\n", (void*)p2[0]);
   printf("Address of p2[1]: %p\n", (void*)p2[1]);
   printf("\n");

   printf("Address of p3:    %p\n", (void*)p3);
   printf("Address of p3[0]: %p\n", (void*)p3[0]);
   printf("Address of p3[1]: %p\n", (void*)p3[1]);
   printf("\n");

   printf("Address of p4:    %p\n", (void*)p4);
   printf("Address of p4[0]: %p\n", (void*)p4[0]);
   printf("Address of p4[1]: %p\n", (void*)p4[1]);
   printf("\n");

   /* Add code to free the allocated memory */
}

二维数组衰变为
int**
(就像一维数组衰变为
int*
),因此使用
*p
一次解引用它就会产生
int*
,如果连续分配int,则
p
将指向与
*p
相同的地址,因为两者都对应于
p[0][0]
(第一个数组的第一个元素的地址)。请注意,当
*
在多维数组上操作时,一次解引用不会产生左值
p
是一个数组数组,尽管它的行为通常类似于/退化为指向指针的指针。我认为因为p是指向数组的指针,当取消引用p时,它返回数组的地址。在这个特殊的代码int p[2][2]中,它恰好是相同的。所以解引用不仅仅返回指针指向的地址值。它取决于指针的类型。 ./test-22 Address of p1: 0x28ac18 Address of p1[0]: 0x28ac18 Address of p1[1]: 0x28ac20 Address of p2: 0x28ac10 Address of p2[0]: 0x80010458 Address of p2[1]: 0x80010468 Address of p3: 0x80010478 Address of p3[0]: 0x80010488 Address of p3[1]: 0x80010498 Address of p4: 0x800104a8 Address of p4[0]: 0x800104a8 Address of p4[1]: 0x800104b0