C++中,指针数组和数组指针
这俩兄弟长得实在太像,以至于经常让人混淆。然而细心领会和甄别就会发现它们大有不同。
前者是指针数组,后者是指向数组的指针。更详细地说。
前: 指针数组;是一个元素全为指针的数组.
后: 数组指针;可以直接理解是指针,只是这个指针类型不是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++中,指针数组和数组指针的更多相关文章
- C/C++中数组转换成指针的情况
数组转换成指针:在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针.比如: int ia[10]; int *p = ia; //ia转换成指向数组首元素的指针 以下情况上述转换不会发生: ...
- C/C++中的指针数组和数组指针
1. 指针数组 定义:int *p[n],由于[]的优先级高于*,p和[]结合成一个数组,该数组的元素存储的是int类型的指针,由于数组内容是指针,因此p+1的步长是sizeof(int*),在32位 ...
- PHP中使用数组指针函数操作数组示例
数组的内部指针是数组内部的组织机制,指向一个数组中的某个元素.默认是指向数组中第一个元素通过移动或改变指针的位置,可以访问数组中的任意元素.对于数组指针的控制PHP提供了以下几个内建函数可以利用. ★ ...
- C语言中字符数组和字符串指针分析
这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这 ...
- 对于C语言中数组名是指针的理解
我们都知道,c语言中数组名是一个指针,比如下面这段代码 #include<iostream>using namespace std;int main(){ int a[4]={1,2,3, ...
- C语言中的指针数组和数组指针
代码: #include <iostream> using namespace std; int main(){ ]; ]; cout<<sizeof(a)<<en ...
- C语言中的函数、数组与指针
1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念: 函 ...
- OpenCV二维Mat数组(二级指针)在CUDA中的使用
CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二 ...
- C语言中数组变量和指针变量
指针变量为什么需要类型? 数组变量和指针变量在使用sizeof时不同,sizeof(数组变量)是数组长度,sizeof(指针变量)是存储int的字节长度4或者8(64bit). 数组变量在参数传递中, ...
- 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法
引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int main( ...
随机推荐
- 基于SVG的web页面图形绘制API介绍
转自:http://blog.csdn.net/jia20003/article/details/9185449 一:什么是SVG SVG是1999由W3C发布的2D图形描述语言,纯基于XML格式的标 ...
- 【java消息格式化】使用MessageFormat进行消息格式化
主要介绍了: 消息格式化的基本使用: 格式化:匹配数字: 格式化:匹配日期: 格式化:匹配时间: 格式化:多次匹配: MessageFormat用来格式化一个消息,通常是一个字符串.MessageFo ...
- WindowsForm只允许运行一个实例
static class Program { private static Mutex onlyOne; /// <summary> /// 应用程序的主入口点. /// </sum ...
- 极限编程之TDD
测试驱动开发(Test-Driven Development,TDD)是通过测试定义所要开发的功能的接口,然后实现功能的开发过程. Test-Driven Development(TDD), ...
- [译] Python 3.5 协程究竟是个啥
转自:http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 ...
- python_day2
一.字符串的基本使用 #!/usr/bin/env python #!-*- coding:utf-8 -*- #!/usr/bin/env python 指定解释器为python abc='hel ...
- JSP、HTML标签
<%@ ...%> 表示是指令,主要用来提供整个JSP 网页相关的信息,并且用来设定JSP网页的相关属性,例如:网页的编码方式.语法.信息等.起始符号为: <%@ 终止符号为: %& ...
- tomcat + apache +jkmod 配置php,jsp共存
httpd.conf ##############################################################################配置phpLoadMo ...
- git 代码组织
在20145306CSAPP2E文件夹下建立相应的文件夹: src:存放源代码文件 include: 存放头文件 bin:存放编译后的目标文件.可执行文件等 lib:存放项目所需的静态库.动态(共享) ...
- 0601 Spring2.0 发布会
ProductBacklog:继续向下细化; 1.界面美化,统一界面风格,以简洁美观为主: 2.丰富版面的内容,吸引用户: 3.尝试增加新的版面: Sprint 计划会议:确定此次冲刺要完成的目标 1 ...