二级指针和指针数组

cpp二级指针,指针数组的问题

在学习c++的指针数组和二级指针后,我上机实验了一下,来区分两者的区别

但是学习过程中发现,指针数组首元素地址(存放的第一个指针元素)竟然与指针数组的地址不一样,然后输出(p1+0)的时候明白了

	int *p1[4];
	for(int i=0;i<4;i++)
	{
		p1[i]=new int[10];
	}//指针数组中的指针动态分配整形数组
	for(int i=0;i<4;i++)
	for(int i1=0;i1<10;i1++)
	{
		p1[i][i1]=i1;//赋值数组中的元素
	}`
	cout<<&p1<<" "<<p1<<" "<<(p1+0)<<" "<<p1[0]<<" "<<*p1[0]<<endl;
		 //结果输出0x6ffda0 0x6ffda0 0x6ffda0 0xb958f0 0

原来是p1[0]指的是p1指针数组的第0号元素指针,所以输出的是该指针的值,然而这里为什么输出的是地址呢?
这是因为该指针又指向了一个整形数组,所以输出的值应该整形数组的地址,类似

int a[10];
cout<<a<<endl;

所以想要输出真正的指针首元素地址,应该是(p1+0),对应p1,即指针数组变量。
同时,要注意到这里的&p1与p1是相同的,但是二级指针就不一样了

	int **p;//定义一个二级指针 
	cout<<&p<<" "<<p<<endl;
	//第一个是指针变量本身的地址,第二个会输出指针未初始化随机分配的地址
	p=new int*[4];
	//动态分配给指针变量一个指针数组 (地址存放的是指针数组的地址)
	cout<<&p<<endl;
	//这里经过动态分配后地址将会变化
	for(int i=0;i<4;i++)
	{
		p[i]=new int[10];//等同于*(p+i),也就是令该指针数组中的第i号分配一个整形数组 
	}
	for(int i=0;i<4;i++)
	for(int i1=0;i1<10;i1++)
	{
		p[i][i1]=i1;
	}
		cout<<&p<<" "<<p<<" "<<(p+0)<<" "<<p[0]<<*p[0]<<endl;
	//输出0x6ffdd0 0x7f1430 0x7f1430 0x7f1480 0

这里发现&p输出的值与p不一样,而指针数组输出的则一样,这就是指向指针数组的二级指针与指针数组的不同之处,二级指针是令一个指针存放指针数组,所以指针变量的地址并不是指针数组的地址,而若是指针数组,它本身的地址就是该变量的地址,相当于一个数组变量,这个变量的地址就是数组的地址。
学这个是相当的绕啊。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值