c语言中的指针我相信很多人都被整懵b过,尤其二级指针和二维数组那块根本不知道指向的是哪些值,我最近也是学了这些个二维数组和二级指针的关系,也就是懂点皮毛,顺便加深一下这方面的知识来浅谈一下,如有错误,必定虚心求教!
#include
int main()
{
int ar[3] = {1,2,3};
int* arp = ar;
return 0;
}
vs中调出监视窗口
一维数组的数组名代表的是数组首元素的地址
还需要注意的一个点就是说指针中*(arp+1) = *arp+1 这是因为地址常量可以退化成对应的指针
当然你也可以查出数组中其他值的地址
相邻两数值之间相隔4,这是由于类型是int型的,
int 型指针+1:地址+4
short型指针+1:地址+2
char型指针+1:地址+1
顾名思义就是若干个一维数组组合到一起。
#include
int main()
{
int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };
int (*arp)[3] = &ar;
return 0;
}
vs调出监视窗口
这个中相当于什么东西呢,和一维指针一样数组名等于首元素的地址,但是二维数组中的首元素是ar[0]这一行的数组,所以二维数组ar这个数组名代表ar[0]这一行数组的首地址。
#include
int main()
{
int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };
int *(arp)[3] = ar;
return 0;
}
以上代码块为正确的代码块,而错误的代码块这样写:
#include
int main()
{
int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };
int *arp = ar; //因为ar是二维数组,二维数组首地址是一个数组,所以必须写成*(arp)[3]
return 0; //该代码为错误代码
}
#include
int main()
{
int br[3] = {1,2,3};
int *s = br; //数组名相当于数组首地址
int (*sbr)[3] = &br; //首地址取地址
int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };
int (*p)[3] = ar;
int (*arp)[3][3] = &ar; //首地址取地址
return 0;
}
上面说到的首地址取地址结果如下(如果显示的不是下图这种格式的胡,右键数据以16进制打开即可)
#include
int main()
{
int ar[5][2]= { 1,2,3,4,5,6,7,8,9,10 } ;
int(*p)[2] = &ar[1];
int* s = ar[1];
printf ("%d \n", p[1][3]);
printf ("%d \n", s[3]) ;
return 0;
}
int(*p)[2] = &ar[1]; //对它进行解引用 int(*p)[2] = &*(ar+1); //然后&和*相互抵消 即为ar+1 //其中int(*p)[2]的意思为无论这个二维数组有几行,它有两列 //然后数组是ar[5][2] = {1,2,3,4,5,6,7,8,9,10} ar+1即为加到第二行数组的首地址 //然后p[1][3] ----> *(p[1]+3) ------> *(*(p+1)+3) 即为指向数字8的首地址 则打印出来为8 //int *s = ar[1] 直接就是int s = *(ar + 1) 则s指向首地址为3的数组 //然后s[3] = *(s+3) 则s[3]的值为3向前加三个元素,为6
对了:
**a相当于a[][]、也相当于*a[]
*(*(a[+1])+2)相当于a[1][2]
指针其实就是内存地址、*a就是内存地址的数据
而数组名就是数组的首地址
[doge]!