指针是二维数组的首地址,二维数组本身就是指针。
二维数组:本质上是以数组作为数组元素的数组,即"数组的数组",二维数组又称为矩阵,行列数相等的矩阵称变方阵。
指针:在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。 在高级语言中,指针有效地取代了在低级语言,但它只适用于合法地址之中。
通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上。之后就可以通过二维指针直接访问了。
参考代码如下,可以看具体注释辅助理解。
#include <stdio.h>//输入输出头文件。#include <stdlib.h>//本程序需要用到malloc/free函数,引用该头文件。int main(){int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //定义二维数组a,并赋值从1-12.int ** p = NULL;//定义二维指针。int i, j; p = (int **)malloc(sizeof(int *) *3);//要访问的数组有三行,所以申请三个一维指针变量。for(i = 0; i < 3; i ++){p[i] = a[i];//将二维数组行地址赋值到对应的一维指针上。} for(i = 0; i < 3; i ++){for(j = 0; j < 4; j ++)printf("%d ", p[i][j]); //用指针输出元素。p[i][j]这里也可以写作*(*(p+i) + j)。printf("
"); //每行输出后加一个换行} free(p);//释放申请的内存。 return 0;}
数组在内存中是连续存储的,在你的改动处 int *p=a;p仍然指向数组的第一个元素,你必须明确在数组a[3][4]中,a、a[0]、a[0][0]的地址完全相同,而意义不同。a表示数组的首地址同时也是第一个元素的地址,a[0]表示数组中第一行的行首地址,a[0][0]表示数组的第一个元素的地址。你定义的int *p=a,实际上是指针p指向了数组的第一个元素的地址,这里p并不是一个行指针。
根据你的定义程序改写为:
/question/182310127.html#
声明: 我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本站部分文字与图片资源来自于网络,转载是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:daokedao3713@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
本站内容仅供参考,不作为诊断及医疗依据,如有医疗需求,请务必前往正规医院就诊
祝由网所有文章及资料均为作者提供或网友推荐收集整理而来,仅供爱好者学习和研究使用,版权归原作者所有。
如本站内容有侵犯您的合法权益,请和我们取得联系,我们将立即改正或删除。
Copyright © 2022-2023 祝由师网 版权所有
邮箱:daokedao3713@qq.com