理解二维数组指针

数组指针中有三条规律(适用于任何维数数组):(来源于李戈老师的计算概率)

数组名相当于指向数组第一个元素的指针;

&E相当于把E的管辖范围上升了一个级别;

*E相当于把E的管辖范围下降了一个级别;

我再增加一条,[]也是把管辖区域下降一个级别。

这三条规律真的很好用!

如果a是一维数组的名字,a指向数组首元素a[0],a+1指向第二个元素,a等于&a[0];

如果a是二维数组的名字,a指向数组首元素a[0],即第一行,a+1指向第二个元素,即第二行,a等于&a[0]。

举个例子:

#include <iostream>
using namespace std;

int main()
{
    int a[3]={0,1,2};
    int (*p)[3];
    int (**pp)[3];
    p=&a;
    pp=&p;
    //这边如果p=a,编译出错,不能将int[3]赋值给int(*)[3]类型
    //a是指针,指向a[0],是a[0]的地址
    //p是指针,指向有3个元素的int数组,作用域比a高一级,所以应该把a上升一级再赋值给p
    //a上升一级是&a
    cout<<a<<endl;//0x61fe90
    cout<<a+1<<endl;//0x61fe94,a的作用域是a[0],占4个字节,所以a+1和a的字节之差是4
    cout<<p<<endl;//0x61fe90
    cout<<p+1<<endl;//0x61fe9c,a[0],a[1],a[2]共占12个字节
    //指针p+1和p的字节之差,取决于指向的内容占几个字节,即指针的作用域
    //p的作用域是整个数组,占12个字节,所以p+1和p的字节之差是12
    cout<<pp<<endl;//0x61fe8c
    cout<<pp+1<<endl;//0x61fe90
    //pp指向的内容是个指针变量,占4个字节,所以pp+1比pp高4个字节
}

再看一道题:来自http://www.nowcoder.com/profile/826954/myFollowings/detail/1103956

#include<iosteam.h>
void main(){
    int n[][3] = {10,20,30,40,50,60};
    int (*p)[3];
    p=n;
    count<<p[0][0]<<","<<*(p[0]+1)<<(*p)[2]<<endl;
}

输出10,20,30

定义p指向一个数组,该数组有3个元素。

n是数组n[2][3]首元素的地址,即n的作用域是第一行。

p=n,则p的作用域也是第一行。

p[0]作用域是第一行第一个元素,p[0][0]就是第一行第一个元素的值,即10。

p[0]作用域是第一行第一个元素,p[0]+1作用域是第一行第二个元素,*(p[0]+1)就是第一行第二个元素的值,即20。

*p,把p的管辖区域下降了一级,因为p的作用域是第一行,那么*p的作用域是第一行第一个元素,(*p)[0]就是第一行第一个元素的值,(*p)[2]就是第一行第三个元素的值,即30。

时间: 2024-10-13 01:58:01

理解二维数组指针的相关文章

二维数组指针及二维动态数组的分配问题

在我以前的文章中都有讲过关于数组指针及指针数组的相关问题,但是讲得不够深入,我后来后了别人写的博客后觉得人家的确实写得好, 也学到了不少东西,对以前的问题有深的领悟了,于是准备结合这些博客和文章再稍微深入一点讲讲这些问题.这些指针的问题是C语言中的基础与关键 而且一旦出现这些问题,不太好找bug的来源,有时候不得不借助反汇编. 参考文章: http://c.biancheng.net/cpp/html/476.html       C语言指针数组和数组指针 http://blog.csdn.ne

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

关于 二维数组指针

概括的说,指针其实就是可变数组的首地址,说是可变数组,是 指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充 分节约宝贵的内存资源.我一向喜欢一维数组,除非万不得已,我一 般是不用二维数组的,多维的则更是很少涉足了.因为一维简单,容 易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更 具有讨论的必要.     闲话少说,这里我就以三个二维数组的比较来展开讨论:     (1).int **Ptr;     (2).int *Ptr[ 5 ];     (3).int ( *P

指针数组和二维数组指针变量

指针数组 概念: 一个数组的元素值为指针则是指针数组. 指针数组是一组有序的指针的集合. 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量. 指针数组说明的一般形式为: 类型说明符 *数组名[数组长度] 其中类型说明符为指针值所指向的变量的类型. 例如: int *pa[3] 表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量. 1.用一个指针数组来指向一个二维数组. 指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数

C语言数组篇(五)多级指针和二维数组指针的区别

多级指针 以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[10] --> 10个空间的数组 * p[10] --> 这10个空间的数组里面存放的数据都是 指针型的数据 int *p[10] --> 数组里面每个指针指向的空间存放的是int型的数据 int *p[10] --> int **p; p: 指针数组的数组名,也是数组的首地址. *p 数组里面存放的指针 **p 数组里面存放的指针 指向的空间 的内容 二维数组指针: 二维数

关于返回二维数组指针问题

所谓的二维数组指针,是指针的指针,指的就是二维数组在内存中的存储地址. 二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址).行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义int a[5][5]:则a[0][0]是a数组 首行首列元素(代表该元素的值).而&a[0][0]是首行首元素的地址.&&a[0][0]则是首行的首地址.从这个意义上讲,可以说行的首地址是一种二重地址,即指针的指针. 废

&lt;24&gt;【掌握】二维数组指针定义、初始化+

[掌握]二维数组指针定义.初始化 数组指针: 定义一个指针变量,让这个指针变量指向一维数组的元素 二维数组指针 行指针,用来指向二维数组的每一行,存放的是行的首地址 定义格式: 数据类型 (*行指针变量名)[数组第二维的长度]; 二维数组指针的初始化 int a[2][3]; int b[2][2]; float f1[4][4]; //假设我要定义一个指向数组a的一个行指针 // a = &a[0] = &a[0][0] = a[0] int (*p)[3] = a; 二维数组指针的使用

二维数组指针

关于一维数组的指针 例子: int a[3]={1,2,3}; int *p=a; printf("%d",*p); 输出为1 一维数组指针就是该一维数组第一元素的地址,取值运算*结果是第一个元素存储值. 再看二元数组 例子: int v[2][5]={{1,2,3,4,5},{6,7,8,9,10}}; int (*a)[5]=v; printf("%p,%p\n",a,a+1); printf("%p,%p\n",*a,*(a+1)); 输出

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi