C 取消引用二维的名称与名称相同。那么解引用做什么呢?
解引用的作用是什么? 它只是返回指针中地址的值吗 WIKI说“它对指针变量进行操作,并返回与指针地址处的值等效的l值” 我被下面的代码弄糊涂了: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所说的是正确的,而且非
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