#深入解析# c++中的指针和数组的关系

1.数组指针

数组指针本质上是一个指针,这个指针指向一个数组

1.1 一维数组指针

int main(void)
{
	char a[5]={'A','K','C','G','L'};	
	char (*p)[5]=&a;//&a代表的是整个数组的首地址
	//char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
	printf("%c %c %c",**p,*(*p+1),*(*p+3));//输出:A K G
	return 0;
}

对于这行代码 char (*p)[5]=&a,我们将它和char p[5]=&a这行代码对比,两者之间只是相差了一个*,而后者 &a表示一个char数组,因此前者就表示一个指向char数组的指针(为何使用&a而不直接用a请参考这篇文章->文章地址

1.1 二维数组指针

int main(void)
{
	char a[3][4]={"for","cr","int"};
	char (*p)[4]=NULL;
	p=&a[0];
	printf("%c %c %s %s\n",*(*p+1),*(*(p+1)+1),*p,*(p+1));//输出:o r for cr
	return 0;
}

二维数组的传递有两种方式:一种是行指针传递,例如上面的代码(p=&a[0]p指向了第一行的地址);一种是列指针传递

  1. char (*p)[4]=NULL;这句代码中,p指向一个容量为4的char数组因此 p+1跨越的是一整个容量为4的char数组。
  2. 因为+的优先级大于*,因此*p+1等价于(*p)+1,*p表示第一个容量为4的char数组的中第一个元素的地址(第一行第一列数据的地址),(*p)+1就表示第一个容量为4的char数组的第二个元素的地址(第一行第二列数据的地址),因此(*p)+1表示跨越char数组内一个char元素的地址
  3. 在上边的基础上再加上一个*就表示取对应地址下的数据了,也就是*(*p+1)
  4. 由上边的三条结论可知:
    p+1代表第二行的地址
    *(p+1)代表第二行第一个元素的地址
    *(p+1)+1代表第二行第二个元素的地址

2. 指针数组

指针数组本质上是一个数组,但是数组里保存的是指针。

2.1 创建指针数组

void print(char **arr)
{
	puts(*arr);//输出:Fortran
	puts(*(arr+1));//输出:C
}
int main(void)
{
	char *p[]={"Fortran","C","C++"};
	print(p);
	return 0;
}
//如果一个指针数组大小不确定,则可以在指针数组的末尾设置NULL
char *a[]={"FORTRAN","C","C++",NULL};
void print(char *p[])
{
	while(*p!=NULL)
	{
		puts(*p++);
    }
}

上述代码中,由于[]的优先级大于*,因此a先和[]结合成 a[]表示a为数组,然后 *char结合,表示数组里的元素为char*类型(char类型的指针)

3. 二维数组

3.1 定义二维数组

int a[3][4];

3.2 二维数组和指针的关系:

a代表a[0]的地址,即:a=&a[0]a[0]代表a[0][0]的地址,即a[0]=&a[0][0]
a+1代表a[1]的地址,即:a+1=&a[1]a[1]代表a[1][0]的地址,即a[1]=&a[1][0]
a+2代表a[2]的地址,即:a+2=&a[2]a[2]代表a[2][0]的地址,即a[2]=&a[2][0]

a[i][j]=*(a[i]+j)=*(*(a+i)+j)=(*(a+i))[j]

3.3 用指针定义二维数组

3.3.1 用行指针定义并初始化二维数组

//定义
int (*p)[4]=NULL;
	
//初始化
p=a;	
//或
p=&a[0];

//引用
p[i][j]
//或
*(p[i]+j)
//或
*(*(p+i)+j)

上述代码中定义了一个数组指针,可指向含有4个整型元素的指针变量。指向二维数组的行指针,它所指向的二维数组的每一行有4个元素,p代表第一行的地址。

3.3.2 用列指针定义并初始化二维数组

//定义
int *p=NULL;

//初始化
p=a[0];
//或
p=*a;
//或
p=&a[0][0];

//引用元素
*(p+i*n+j)
//或者
p[i*n+j]

上述代码将二维数组看成一个一维数组,具有m*n个元素,p代表第一行第一个元素的地址。

unordered_map<string, string > **map1;
map1 = new unordered_map<string, string >*[5];

4. 指向指针数组的指针变量

指向指针数组的指针变量将在下一篇文章中叙述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

energy_百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值