C++中int *p[4]和 int (*q)[4]的区别
这俩兄弟长得实在太像,以至于经常让人混淆。然而细心领会和甄别就会发现它们大有不同。
前者是指针数组,后者是指向数组的指针。更详细地说。
前: 指针数组;是一个元素全为指针的数组.
后: 数组指针;可以直接理解是指针,只是这个指针类型不是int也不是char而是 int [4]类型的数组.(可以结合函数指针一并看看......)
int*p[4]------p是一个指针数组,每一个指向一个int型的
int (*q)[4]---------q是一个指针,指向int[4]的数组。
两者在定义的时候如下:
int k;
cin>>k;
char *p[2];
p[0]=new char[k];
p[1]=new char[k];
char (*b)[2];
b=new char[k][2];
这样空说是不是依旧小白?举个例子
#include <iostream>
using namespace std; int main()
{
int *p[4]; //p是一个指针数组,每一个指针都指向一个int型数据
int a=1,b=2,c=3,d=4;
int i;
p[0]=&a;
p[1]=&b;
p[2]=&c;
p[3]=&d;
int (*q)[4];//q是一个指针,指向int[4]数组
//q[0]=&a;//error q是指向int[4]数组的指针,而&a是一个int型指针,所以不能赋值
int aa[4]={5,6,7,8};
q=&aa;
cout << "p的值:" << p << endl; //注意,p不等于p[0]
cout << "p[0]的值:" << p[0] << " a的地址:" << &a << endl; cout << "p[0]地址保存的值:" << *(p[0]) << " a的值:" << a << endl;
cout << "p[1]地址保存的值:" << *(p[1]) << " b的值:" << b << endl;
cout << "p[2]地址保存的值:" << *(p[2]) << " c的值:" << c << endl;
cout << "p[3]地址保存的值:" << *(p[3]) << " d的值:" << d << endl; cout << "q的值:" << q << " aa的地址:" << &aa << endl; cout << "q[i]的地址:" << endl;
for(i = 0; i < 4; ++i)
cout << q[i] << endl;//q[0] 与 q的值相同 cout << "q指向int[4]的所有值:" << endl;
for(i = 0; i < 4; i++)
cout << q[0][i] << ' ';
cout << endl;
//cout<<*(p[0])<<*(q[0])<<endl;
return 0;
}
运行结果:
p的值:0x22ff60
p[0]的值:0x22ff5c a的地址:0x22ff5c
p[0]地址保存的值:1 a的值:1
p[1]地址保存的值:2 b的值:2
p[2]地址保存的值:3 c的值:3
p[3]地址保存的值:4 d的值:4
q的值:0x22ff30 aa的地址:0x22ff30
q[i]的地址:
0x22ff30
0x22ff40
0x22ff50
0x22ff60
q指向int[4]的所有值:
5 6 7 8
以下为网友的解释,可能阐述得更为细致。
定义涉及两个运算符:“*”(间接引用)、“[]”(下标),“[]”的优先级别大于“*”的优先级别。
首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4];剩下的“int *”作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便)

再看int (*q)[4]。它首先是个指针,即*q,剩下的“int [4]”作为补充说明,即说明指针q指向一个长度为4的数组。int (*q)[4]的存储结构如下:

请看以下定义:
int a[2][4]={{2,5,6,8},{22,55,66,88}};
int c[4]={5,8,9,4};
int d[3]={23,12,443};
int *p[4],(*q)[4];
q=a;
*p=c;
*(p+1)=d;
则int *p[4]和int (*q)[4]的存储数据为:


验证:
#include <stdio.h>
int main(void)
{
int a[2][4]={{2,5,6,8},{22,55,66,88}};
int c[4]={5,8,9,4};
int d[3]={23,12,443};
int *p[4],(*q)[4];
q=a;
*p=c;
*(p+1)=d;
int i,j;
for(i=0;i<2;i++)
for(j=0;j<4;j++)
{
if((i==1)&&(j==3)) break;
printf("*(*(p+%d)+%d)=%d\n",i,j,*(*(p+i)+j));
}
puts("===============");
for(i=0;i<2;i++)
for(j=0;j<4;j++)
printf("*(*(q+%d)+%d)=%d\n",i,j,*(*(q+i)+j));
return 0;
}
输出结果为:
*(*(p+0)+0)=5
*(*(p+0)+1)=8
*(*(p+0)+2)=9
*(*(p+0)+3)=4
*(*(p+1)+0)=23
*(*(p+1)+1)=12
*(*(p+1)+2)=443
===============
*(*(q+0)+0)=2
*(*(q+0)+1)=5
*(*(q+0)+2)=6
*(*(q+0)+3)=8
*(*(q+1)+0)=22
*(*(q+1)+1)=55
*(*(q+1)+2)=66
*(*(q+1)+3)=88
C++中int *p[4]和 int (*q)[4]的区别的更多相关文章
- C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
- MySQL中你肯定不知道的int隐情
MySQL中定义id字段为int类型,但是你知道它内部是什么玩意吗? 1.如果定义int类型,但是不声明长度,系统默认为11个长度(这个大家都知道): 2.如果指定长度小于11,实际上系统还是默认为1 ...
- C++中(int&)和(int)的区别
在说这个问题之前,先说两个需要知道的背景知识: (1)语言的类型的强制转换不会修改原来的数据,会另外的开辟一个临时的或者程序中指定的空间来存储强制转换后的值. (2)C++引用的实现是在符号表中动了手 ...
- int *p[4]与int (*q)[4]的区别
以上定义涉及两个运算符:“*”(间接引用).“[]”(下标),“[]”的优先级别大于“*”的优先级别. 首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4]:剩下的 ...
- Java中List、integer[]、int[]之间的转化
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...
- Qt中QString、QByteArray、int、double之间转换
最近写Qt中的tcp网络编程,Socke连接后,接受到的数据类型是字节型,这就涉及到了大量的类型转换,在网上辗转几辄,总算有了点结果,特此跟大家分享.好了,不废话,下面细说. 方法/步骤 1. ...
- 谈谈Java中整数类型(short int long)的存储方式
在java中的整数类型有四种,分别是byte short in long,本文重点给大家介绍java中的整数类型(short int long),由于byte只是一个字节0或1,在此就不多说了,对ja ...
- C++中UINT32和INT32以及int,BOOL和bool的差别
在AndroidHAL层开发中,编写C++代码的时候.遇到了数据类型的困扰.经过查找资料,总结例如以下: 1.UNIT32和int以及INT32的差别: (1).int默认是signed int.也就 ...
- Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题
在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...
随机推荐
- PMP考试--关于职业道德
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 ★四个价值标准(value standards) 责任(responsibility ...
- 旅行计划-DAG上最长路
http://www.luogu.org/problem/show?pid=1137 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发 ...
- CI 自动提交表单
//coontrol $this->load->view ( '/' . $this->index_lang ['FOLDER'] . '/eprepag_form.php', $p ...
- mysql下的常用操作
本文继 linux下安装mysql,记录下在工作中最常用的mysql语句 MySQL添加字段和删除字段 添加字段: alter table `user_movement_log`Add column ...
- python函数基础以及函数参数简解
python中函数分为函数.内置函数Python所有的内置函数 自定义函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. ...
- Android fragment 想activity 传送数据
fragment可以通过定义 fragment的接口的方法来 想activity传送数据: 而activity则是通过实现 fragment的接口来接收fragment的送来的数据: 1.在fragm ...
- STL源码分析-AVL树-RB树
AVL树 不平衡情况 插入节点位于左子节点的左子树(左左) 插入节点位于左子节点的右子树(左右) 插入节点位于右子节点的左子树(右左) 插入节点位于右子节点的右子树(右右) 左左.右右为外侧插入,左右 ...
- 2016-03-24:Windows内存泄露分析工具
参考资料 100%正确的内存泄漏分析工具 ------ tMemMonitor (TMM)
- Solaris磁盘设备
Solaris的磁盘分区称为分片(slice),在磁盘上,一个环形就是一个分区分片的命名通常是c#t#d#s#c:Controller number,控制器标号,c0就是第一个控制器t:Taget n ...
- [原]hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)
本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01 ...