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

例程:

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

#define ROW  3
#define LINE 3

void main(void)
{
	const int array[ROW][LINE] = {			//array 是一个指向 int [LINE] 的指针
		{11,12,13},
		{21,22,23},
		{31,32,33}
	};
	unsigned char row, line;
	const int *pr			 = NULL;	//int *pr 是一个指向 int * 的指针
	const int (*arrpr)[LINE] = NULL;		//int (*arrpr)[ROW] 是一个指向 int [LINE] 的指针,与 array 同类型
	const int **dpr			 = NULL;	//int **dpr 是一个指向 int* 的指针,与 &pr 同类型。

	// 二维数组值
	printf("//              二维数组值:array[row][line]              //\n");
	for(row=0; row<ROW; row++)
	{
		for(line=0; line<LINE; line++)
			printf("row:%d,line:%d,value:%d    ", row, line, array[row][line]);
		putchar('\n');
	}
}

打印出的结果为:

下面我们用单层指针来输出二维数组的值:

	// 指针与二维数组值
	pr = array;	//强制将array(int [LINE])的类型转化为(int *)的类型。PS:自加1的时候加的是sizeof(int)而不是3*sizeof(int)了。
	for(row=0; row<ROW; row++)
	{
		for(line=0; line<LINE; line++)
			printf("row:%d,line:%d,value:%d    ", row, line, *(pr+row*3+line));
		putchar('\n');
	}

pr = array;  将双层指针强制转换为单层指针,这是pr自加1加的是 sizeof(int),又因为数组存储在一连续的堆栈中,所以用 *(pr+row*3+line) 可以输出数组的值。

下面我们用二维数组指针来输出二维数组的值:

	// 二维数组指针与二维数组值
	arrpr = array;	//arrpr 与 array 属于同一类型的指针
	printf("//              二维数组指针与二维数组:arrpr[row][line]              //\n");
	for(row=0; row<ROW; row++)
	{
		for(line=0; line<LINE; line++)
			printf("row:%d,line:%d,value:%d    ", row, line, arrpr[row][line]);
		putchar('\n');
	}

arrpr = array;  相当于将二维数组指针赋给另一个二维数组指针。所以 arrpr 可以和 array 一样使用:arrpr[row][line]

下面我们用二层指针来输出二维数组的值:

	// 二层指针与二维数组值
	//方法一:
	printf("//              二层指针与二维数组:*(*dpr+line)              //\n");
	for(row=0; row<ROW; row++)
	{
		pr = array[row];
		dpr = &pr;
		for(line=0; line<LINE; line++)
			printf("row:%d,line:%d,value:%d    ", row, line, *(*dpr+line));
		putchar('\n');
	}
	//方法二:
	printf("//              二层指针与二维数组:**dpr              //\n");
	for(row=0; row<ROW; row++)
	{
		for(pr=array[row]; pr-array[row]<LINE; pr++)
			printf("row:%d,line:%d,value:%d    ", row, line, **dpr);
		putchar('\n');
	}

之前我试过用

dpr = array;    //强制将array(int [LINE])的类型转化为(int *)的类型

无论是用 pr 的输出方法输出,还是用 arrpr 的输出方法输出,得到的都是错误的结果。

int **dpr 类型的变量不能直接接受二维数组的地址,对于二维数组来说,dpr 相当于 int (*arrpr)[ ] 类型的指针,没有指明包含了多少int类型,是错误的。

所以第一层指针必须得指明宽度:

pr = array[row];

第二层指针再指向第一层指针:

dpr = &pr;

然后在用:

*(*dpr+line)

输出数组。

时间: 2024-10-24 12:35:59

例看二维数组,指针,二维数组指针的相关文章

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

指针与一维数组和二维数组以及字符串指针数组的学习笔记

废话不多少,直接上代码,关键的东西已经注释了,看注释信息理解即可. 说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,如果需要, 请自行加入printf调试即可. 转贴请注明出处,欢迎和我讨论,谢谢. ----------cofin_add #include <stdio.h> void fun(int m, char *((*p)[m])){ int i = 0;

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

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

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

关于数组以为指针二维指针的应用举例

事实上,计算机系统的多维数组其实最终还是以一维数组的形式实现的.就N x M的二维数组来讲,设其数组名为array.指针array指向一个数组,该数组存放的是一系列指针,这些指针分别指向相应的一维数组,而这些数组中存放的才是我们的数据. 由此array 是第i个指针变量地址,array[j]则表示相对于第i个指针变量偏移j*sizeof(数组类型).系统通过这种机制访问了该二维数组的第i行,第j列的内容.有上述可知,指向二维数组的指针其实是指向“指针变量地址”的指针变量.所以在声明指向二维数组的

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

二维数组及二维指针的传递及一些思考

二维数组和二位指针在程序知识中是一个难点,往往会将人弄得头昏眼花.总结一下这个难点的相关问题. 二维数组,顾名思义就是数组的数组:二维指针是指针的指针.首先,我们来看看二维数组和二维指针等价的问题. 在<C专家编程>10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!) 数组和指针参数是如何被编译器修改的? "数组名被改写成一个指针参数"规则并不是递归定义的.数组的数组会被改写成"数组的指针",而不是"指针的指针":

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

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

C/C++ 指针数组、二维数组

一. 二维数组 1> 初始化 int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 这里是 {} , 而不是() 2> 将二维数组当做一维数组处理 void print_array( int * p, int row, int line) { for(int i=0; i<row; ++i) { for(int j=0; j<line; ++j) { printf("%d \n", *( p + i * row + j