二维数组指针问题

对于二维数组int a[][4]来说。。有以下要点:

1、

表示形式            含义                                                 结果(举例)  备注

a                    二维数组名,指向一维数组a[0],即0行首地址  2000   行指针

a[0],*(a+0),*a   0行0列元素的地址                                   2000   列指针

a+1,&a[1]            1行首地址                                          2016   行指针

a[1],*(a+1)           1行0列元素a[1][0]的地址                     2016

a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址          2024

*(a[1]+2),*(*(a+1)+2),a[1][2] 1行2列元素a[1][2]的值           该元素值

2、行指针与列指针:

定义: 指向行的指针叫行指针,指向列的指针叫列指针

关系: *行指针 <=> 列指针      &列指针 <=> 行指针

要点: 1、行指针指向行,表示该行地址;  (行指针不指向某一具体单元,而指向行(该行首地址))

     列指针指向列,即某个元素,代表该元素的地址

        例如:(a+1)是行指针,它指1向行的首地址,而不是a[1][0]的地址,故:*(a+1)不是代表a[1][0]的值,

          而是转为了列指针,代表a[1][0]的地址,而*(*(a+1)才代表a[1][0]的值;

             a[1]是列指针,它指向1行0列元素的地址,故*a[1]即a[1][0]的值

2、对行指针加1,代表下一行的首地址;如(a+2)代表2行首地址

对列指针加1,代表下一个元素的地址;如(a[0]+5)代表元素[1][0]的地址

3、区分  1、二维数组名代表行指针;     如:a,a+1等就是行指针,*a,*(a+1)是列指针

2、一维数组名代表列指针:     如:对于一维数组b[4],b+1代表元素b[1]的地址

3、注意:若将二维数组a[][4]看出数组名为a[]的一维数组,则:     a[1]代表元素a[1][0]的地址,而&a[1]则是行指针,代表1行的首地址;

程序举例: 1、 # include <stdio.h>

int main(void) {

int a[4] = {1, 3, 5, 7};

int (*p)[4];  //将p定义为行指针,它只能指向行,而不能指向某个元素;    //int *p[4];  //error: int *p[4]定义了一个指针数组,该数组都是int * 型,即整型指针类型

p = &a;

//p = a; //error:一维数组a[4]的a为列地址,必须转为行地址&a,才能赋值给列指针;    printf("%d\n", (*p)[3]);     return 0;  }

2、 # include <stdio.h>

int main(void) {

int i, j;

int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};

int (*p)[4];  p = a;

printf("please input row and colum\n");

scanf("%d%d", &i, &j);

printf("a[%d,%d] = %d\n", i, j, *(*(p+i)+j));

return 0;  }

/**********************************************************************************************************

注意:

*(*(p+i)+j)) 等价于 (*(P+i))[j]  //(*(P+i))相当于一维数组名a[i];

不等价于*(P+i)[j]  //*(P+i)[j]相当于a[i+j][0],为什么我也不知道,运行结果是这样;

           *(P+i)[j]不等价于*(p+i+j),*(p+i+j)是i+j行的首地址,是列地址 **********************************************************************************************************/

时间: 2024-08-14 19:19:09

二维数组指针问题的相关文章

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

所谓的二维数组指针,是指针的指针,指的就是二维数组在内存中的存储地址. 二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址).行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义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)); 输出

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

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

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

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

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语言中数组,指针数组,数组指针,二维数组指针

1.数组和指针 int array[5] = {1,2,3,4,5};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) *

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

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