C语言之二维数组

二维数组及其指针

1 ) 在了解二维数组之前,我们先来了解一维数组及其指针

我们知道,一维数组中:数组名代表-->数组首元素的首地址    (千万不要认为是数组的首地址(&a),绝对不是)

  1. 在内存中,该代码的表现形式如下图:</span>
  2. #include<stdio.h>  
    {  
          int a[4];  
          int *p  = a;  //表明该指针指向了数组的首元素地址,当然也可以写为 int *p = &a[0];  
          return 0;  
    }

-- 这时候,对指针取值(*p),就是对取出指向地址&a[0]中的值的就是a[0]的数据。

----------------------------------分割线------------------------------------

2 )下面我们进入二维数组的介绍,首先,请看一段代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a[2][4] = {1,2,3,4,
  5. 5,,4,5,6};
  6. return 0;
  7. }该代码的表现形式如下图:

  右边的a[ 0 ] [ 0 ]  这些数据对应的是二维数组中(每个数组中的元素)。

了解了二维数组在内存中的表现形式: 

--我们开始引入数组指针的概念:


    2.1)  顾名思义:数组指针就是指向数组的指针,根据复杂类型的确认 ,数组指针形式为  int(*p)[ 3 ]; 表明该指针指向了(有三个int型数据)的数组 ,那么该数组名 a 就是数组a[ 0 ]的首地址,即(&a[ 0 ],也可写为a

---(这点和一维数组的数组名相同----->都是数组首元素的首地址)

(***注意:该 图形两块不同的区域代表两个不同的数组----后面跟着的是每一个数组里面包含的元素)


     2.2)  a[ 0 ]这个数组名 代表了a[ 0 ]这个数组里面 a[ 0 ][ 0 ]的值的地址, 即----> a[ 0 ] == &a[ 0 ][ 0 ]   -

对于a[ 0 ]---- 这里可理解(不可画等号)为a[ 0 ] 是一个指针 ( 因为数组名是该首元素a[ 0 ][ 0 ]的地址嘛,既然是地址,就必须用指针来接收 )。

    2.3)p = a ;就是指向了a[ 0 ]这个数组的首地址。 也可写成&a[ 0 ];  名为二维数组的行指针

      那么如果对 p 进行 p +1 操作,就表示地址移动到下一行(移动了sizeof(int)*4 = 16个字节),就是下一个数组的地址 -- 如上图所示         

    技巧 - -  / * 我们将二维数组依次看作一维数组逐步分析 * /

     2.4)所以 p = a  + i ;   等价于   p = &a[ 0 ] + i     

这是行指针的概念,如果对 p 取 * 运算符,表示取出 p 指向的内容,而 p 指向的的内容就是a[ 0 ],     行指针用来确定对哪一个数组的值进行操作,  直观的就是,这这个二维数组中, 选 a[ 0 ], a[ 1 ]这两个之中的其中一个进行操作),  

2.5)  *p  = *( &a[  0 ] )= a[ 0 ]  , * (p + i) = a[ i ](c语言中,方括号[ ]运算符和*()运算符一致,可互换)

a[ 0 ]  + i   ==  &a[ 0 ][ 0 ] + i     就是列指针的概念(对数组的每一个元素进行操作),对a[ 0 ]这个数组里面的元素地址 + i ,指到相应元素a[ 0 ][ i ]的地址  即 &a[ 0 ][ i ]我们已经知道a[ 0 ]就是 a[ 0 ][ 0 ]的值的地址,即&a[ 0 ][ 0 ]   所以如果对a[ 0 ]取 * 运算符,得到的就是a[ 0 ][ 0 ]的值。

即 *( a[ 0 ]+ i ) = a[ 0 ][ i ]

--------------------------------------看了这些不知道对各位朋友有无帮助。

  下面我对二级指针做一个画图分析: 让我们更深一步的理解二维数组指针


             ---------------------------------------------------------------------------------------------------

在文中有什么不对或者需要改进的地方,请各位朋友对我给出宝贵的意见和建议


时间: 2024-10-01 23:49:54

C语言之二维数组的相关文章

C语言动态分配二维数组内存

C语言内存管理主要包括malloc().remalloc().free()三个函数. malloc原型 extern void *malloc(unsigned int num_bytes); m行n列的 二维数组的分配,主要有三种方法: 一.分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>

C语言 memcpy二维数组的复制

今天在实现二维数组的复制功能时,竟然出现了好多问题,还是太不小心了. 我们知道,平时进行矩阵复制,无非是二重循环进行赋值操作,所以今天想改用利用memcpy进行复制操作,当然一维数组的复制在上一篇文章已经练习过了 需要注意的问题是: 复制的本质是利用:行+变量字节数*列  这种表达,所以目标数组的行数一定是固定的 刚开始想到项目中行数是未知的,默认为空,结果程序逻辑问题,不停的溢出,所以要小心 #include <stdio.h> void print(int *data,size_t m,s

【学习笔记】【C语言】二维数组

1. 什么是二维数组 一个数组能表示一个班人的年龄,如果想表示很多班呢? 什么是二维数组?int ages[3][10]; 三个班,每个班10个人 相当于3行10列 相当于装着3个一维数组 二维数组是一个特殊的一维数组:它的元素是一维数组.例如int a[2][3]可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素 2.二维数组的定义 二维数组定义的一般形式是:     类型说明符 数组名[常量表达式1][常量表达式2] 其中常量表达式1表示第一维下标的

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if

【C语言】二维数组做形参

二维数组有两种形式: ①在栈上: int a[4][4] = {...}; ②在堆堆上: int ** a = new int *[4]; for(int i = 0; i < 4; i++) a[i] = new int[4]; 这两种情况下,二维数组做形参的传参方式是不一样的. ①在栈上时 void fun(int * a, int rownum, int colmunnum)   //形参传递按照一维指针 { ... a[r * colmunnum + c] = ...;     //根据

C#语言之二维数组

内容: 二维数组:一维数组----豆角二维数组----表格 定义:一维数组:数据类型[] 数组变量名 = new 数据类型[数组长度];数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 二维数组:数据类型[,] 数组变量名 = new 数据类型[行数,列数];int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值 下标都是从0开始的取值: a[行下标,列下标] 锯齿数据,数组的数组.定义:第一步:定义大数组数据类型[][] a =

C语言+二维数组实现扫雷游戏(贴过来后无缩进尽请谅解,工程完成度:70%)

#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10 #define L 10 //打印随机雷的位置,测试代码方便看雷 void sl_print(constint a[L]) { int i=0; printf("地雷的随机位置为:"); for(i=0;i<L;i++) { printf("%02d ",a[i]); } printf(

黑马程序员——C语言基础---二维数组详解

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 二维数组: 可以看做是一个特殊的一维数组 ,这个一维数组的每个元素又是一个一维数组 二维数组的定义 数据类型   数组名[第一维的长度(行)][第二维的长度(列)]; int a[2][3];       理解方法:       1)这是

【C语言】二维数组中的查找,杨氏矩阵

//二维数组中的查找,杨氏矩阵 //在一个二维数组中,每行都按照从左到右的递增的顺序排序.每列都按照从上到下递增的顺序排序. //请完成一个函数,输入这样的一个数组和一个数,判断数组中是否包含这个数. #include <stdio.h> #define Col 4 int Yang(int arr[][Col], int val) { int i=0; int j = Col - 1; int tmp = arr[i][j]; //找到左上角的数 while (1) { if (tmp ==