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]
,一个指向2int
数组的指针。因此,*p
是一个2int
的数组
尤其是,*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