二级指针和二维数组

c语言中的指针我相信很多人都被整懵b过,尤其二级指针和二维数组那块根本不知道指向的是哪些值,我最近也是学了这些个二维数组和二级指针的关系,也就是懂点皮毛,顺便加深一下这方面的知识来浅谈一下,如有错误,必定虚心求教!

首先一级指针和一维数组的关系:
 

#include
int main() 
{
	int ar[3] = {1,2,3};
	int* arp = ar;
	return 0;
}

vs中调出监视窗口

二级指针和二维数组_第1张图片va

一维数组的数组名代表的是数组首元素的地址 

还需要注意的一个点就是说指针中*(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进制打开即可)

二级指针和二维数组_第2张图片

 最后再拿出我们老师的一道例题

#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]!

你可能感兴趣的:(初识c语言,经验分享)