精华内容
下载资源
问答
  • 二维数组在内存中的存储方式? 二维数组的小标,哪个是行,哪个指列?

    二维数组在内存中的存储方式?



    二维数组的小标,哪个是行,哪个指列?


    展开全文
  • 二维数组实际在内存中的存储方式 提示:二维数组也是按照像一维数组那样的存储.注意:如何证明:通过指针来进行访问每一个元素*(*a+1) 1.*a 表示将一个行地址变成该行的首地址(即一个具体元素的地址)) 2.&a[0]...

    二维数组实际在内存中的存储方式
    这里写图片描述

    提示:二维数组也是按照像一维数组那样的存储.

    注意:如何证明:通过指针来进行访问每一个元素*(*a+1)
    1.*a 表示将一个行地址变成该行的首地址(即一个具体元素的地址))
    2.&a[0][1]表示讲一个具体的元素地址 提升为该行的行地址(*与&转换关系相反)

    #include<stdio.h>
    #include<windows.h>
    int main()
    {
        int a[3][4];
        int i, j;
        for (i = 0; i < 3; i++)
        {
            for (j = 0; j < 4; j++)
            {
                a[i][j] = i * 4 + j;
            }
        }
        for (i = 0; i < 12; i++)
        {
            printf("a[%d]=%d\n", i,*(*a+i));
        }
    
        system("pause");
        return 0;
    
    }

    这里写图片描述

    展开全文
  • 一.数组的创建和初始化1.创建方式: type_t(数组的元素类型) arr_name [const_n] (是一个常量的表达式...一维数组在内存中的存储1.数组在内存中是连续存放的,如果是整型 int 地址差4个字节 访问arr[i], 编译器,...

    一.数组的创建和初始化

    1.创建方式:  type_t(数组的元素类型)  arr_name     [const_n] (是一个常量的表达式,用来指定数组的大小)

    创建数组 【】必须要给一个常量才可以,不能使用变

    2.数组的初始化:在创建数组的同时给数组的内容一些合理初始值)

    二.一维数组在内存中的存储

    1.数组在内存中是连续存放的,如果是整型 int  地址差4个字节 

      访问arr[i], 编译器,是这样做的 *(arr+i)     arr --是首元素地址。也可以这样理解  arr+i = &arr[i]

    三.指针

    1.内存中的一个内存单元,对应一个地址。

    2.在32位的平台上指针的大小是4个字节。64位平台是8个字节。

    3.指针可以理解成一个变量,是一个用来存放地址的一个变量。

    4.指针初始化  int*p = NULL   char  *p = NULL

    5.数组名其实是数组首元素的地址

    6.数组名+整数的运算 ,可以获得数组每个元素的地址

    四.sizeof与strlen

    1.数组名单独放在sizeof内部,数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节

    2.表示整个数组的还有  &+数组名  -- 虽然它表示的也是首元素的地址,但是有所不同:例  int  arr[] ={1,2,3}

        &arr   地址 ---0x0126FE34               arr 首元素地址 -- 0x0126FE34

       &arr+1 地址 --  0x0126FE40                 arr +1地址 --0x0126FE38

     3. int  arr[]={1,2.3}    对于 *arr   其实相当于  *(arr+0)也相当于  arr[o]

     4. char arr[] = {'a','b','c'}    arr+0 是首元素地址,&arr  整个数组的地址    &arr[0] 首元素的地址  

    注意:

           strlen 是从起始地址往后读取内容

           这里sizeof   不需要‘\0’ 但是 strlen 必须要‘\0’否则求的是随机值    

           

    5.char *p= "abcd"    在内存中开辟了一块空间 p  把首元素a的地址放在 p里 ,这里并没有创建数组。

    6.在二维数组中  int a[3][4] = {0}  

                       sizeof(a)    =  48    ,这里的数组名表示整个数组

                        sizeof(a[0])  =  16 ,  a[0]  可以看做一维数组  ,相当于第一行

                        sizeof(a[0]+1) = 4 ,  a[0] 是第一行,第二列的元素

                         sizeof(a+1) = 4 ,第二行的地址

                        sizeof(&a[0]+1) =4 , 第二行的地址

                          sizeof(*a)= 16 ,第一行的元素                 把二维数组当一维数组来看

                      sizeof(a[3])= 16             sizeof 不运行内部表达式




    展开全文
  • 5.2二维数组

    2020-06-22 18:27:12
    二、二维数组在内存中的存储方式(详细见指针的部分介绍) 三、二维数组的初始化 完全初始化 不完全初始化 四、二维数组的引用 通过指针引用多维数组(见指针部分) 普通引用 五、二维数组的操作 输出二维...

    5.2 二维数组

    一、二维数组的定义

    类型说明符 数组名 [常量表达式(行)][常量表达式(列)]

    a[2][3] 代表一个2行3列的数组

    第一列 第二列 第三列
    第一行 a[0][0] a[0][1] a[0][2]
    第二行 a[1][0] a[1][1] a[1][2]

    a[i][j] 代表第i+1行,第j+1列

    二、二维数组在内存中的存储方式(详细见指针的部分介绍)

    实际上二维数组的存储也是线性的,是在内存单元中开辟一个连续的内存空间
    类比一维数组

    整型单元 a[0] a[1] a[2]
    地址 1000 1004 1008

    二维数组的存储

    整型单元 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
    地址 1000 1004 1008 1012 1016 1020

    三、二维数组的初始化

    完全初始化

     1. 第一种
     int a[2][3]={1,2,3,4,5,6};
    
    第一列 第二列 第三列
    第一行 1 2 3
    第二行 4 5 6
     2. 第二种
     int a[2][3]={
                    {123}{456}
     };
    

    不完全初始化

    1. 第一种
    int a[3][4]={1};
    //其他所有元素则默认为0;
    
    2. 第二种
    //这种只适合部分编译器
    int a[3][4]={
        {1,2,3,4},
        {},
        {9,10,11,12}
    }
    
    3. 第三种
    int a[3][4]={
        {1,2,3,4},
        {5,6},
        {9,10,11,12}
    }
    
    4. 第四种
    int a[3][4]={
        {1,2,3,4},
        {5,6}
    }
    
    5. 第五种
    int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    //这种编译器会根据输入的元素,自动计算这是个几行4列的数组;
    //注意不能省略列数!!!
    

    四、二维数组的引用

    通过指针引用多维数组(见指针部分)

    普通引用

    数组名[行标][列标]

    a[0][1]=5;
    a[i+3][a[0][5]]=a[0][1]*2;
    
    

    下标可以是整型表达式

    五、二维数组的操作

    输出二维数组

    int main(void)
    {	
    	int a[3][4]={
    		{1, 2, 3, 4},
    		{5, 6, 7, 8},
    		{9,10,11,12}
    	};
    	int i,j;
    	for(i=0;i<3;++i)
    	{
    		printf("第%d行的元素是:\n",i+1);
    		for(j=0;j<4;++j)
    		{		
    			printf("%-5d",a[i][j]);
                //-5表示按左对齐,且占5个格			
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

    求二维数组最大的元素返回下标

    #include <stdio.h>
    #include <stdlib.h>
    /*
    输出函数
    */
    void show(int a[][5])
    {
        int i,j;
    	for(i=0;i<6;++i)
    	{
    		printf("第%d行的元素是:\n",i+1);
    		for(j=0;j<5;++j)
    		{		
    			printf("%-5d",a[i][j]);			
    		}
    		printf("\n");
    	}
    }
    /*
    求每一行的最大元素
    */
    void max_row(int a[][5])
    {
    	int i,j;
    	int k = 0;
    	for(i=0;i<6;++i)//i<行数
    	{
    		for(j=0;j<5-1;++j)//j<列数-1
    		{
    			if(a[i][j]>a[i][j+1])
    			{
    				k=a[i][j+1];
    				a[i][j+1]=a[i][j];
    				a[i][j]=k;				
    			}			
    		}
    		printf("第%d行最大元素是:%d\n",i+1,a[i][4]);//a[行][最后一列列标]
    	}
    }
    /*
    求该数组的最大元素,并返回其下标。
    */
    void max(int a[][5])
    {
    	int max = a[0][0];
    	int i,j,row,colum;
    	for(i=0;i<6;++i)
    	{
    		for(j=0;j<5;++j)
    		{
    			if(a[i][j]>max)
    			{
    				max=a[i][j];
    				row=i;
    				colum=j;
    				//printf("最大值是:%d\n其行标是:%d,其列标是:%d\n",a[i][j],i,j);
    			}
    		}
    	}
    	printf("该数组中元素的最大值是:%d\n其行标是:%d,其列标是:%d\n",max,row,colum);
    
    }
    int main(void)
    {	
    	int a[6][5]={
    		{1, 2, 10, 4, 6},
    		{5, 22, 7, 8, 9},
    		{9,6,11,12,100},
    		{33,54,32,99,30},
    		{77},
    		{99}
    	};
        show(a);
        max_row(a);
    	max(a);
    	system("pause");
    	return 0;
    }
    

    求二维数组的鞍点(该行最大、该列最小)

    指针学过后再补充

    判断矩阵是否对称

    1 2 4 7
    2 3 5 8
    4 5 6 9
    7 8 9 10

    如上图所示,这是一个对称矩阵

    int main(void)
    {
        int a[4][5] = {
            {1,2,4,7},
            {2,3,5,8},
            {4,5,6,9},
            {7,8,8,10},
            {0}
        };
    
        int i=0;
        int j=0;
        for(i=0;i<4;++i)
        {
            for(j=0;j<4;++j)
            {
                if(a[i][j]!=a[j][i])
                {
                    printf("这不是一个对称矩阵!");
                    return 0;
                }
            }
        }
        printf("这是一个对称矩阵!");
        return 0;   
    }
    

    六、是否存在真正的多维数组

    不存在
    因为内存是线性一维的
    n维数组可以当做每个元素是n-1维数组的一维数组
    以二维数组为例:
    int a[3][4]
    该数组是含有3个元素的一维数组
    只不过每个元素都相当于一个包含4个元素的一维数组。

    展开全文
  • 第二,matrix是一个二维数组,二维数组在内存中是按行存放的,即先放第1行,再放第2行……每行中的元素是按列下标由小到大的次序存放,这样的存储方式也称为行优先存储。 第三,这里定义的数组 int *matrix是一个...
  • 本篇文章是关于数组的描述 ...二维数组在内存中的存储。 二维数组的指针访问。 一维数组的创建和初始化 数组的创建 对数组的描述:数组是一组相同类型元素的集合 数组的创建方式: type_t arr_name ...
  • 实际上, 二维数组在主存中的存储方式和一维数组无异, 都是占用一片连续的存储空间. 现在我们需要在逻辑上构造一个m行n列的矩阵, 之前使用二维数组进行定义时, 应这样定义 short M[m][n]: 这是一个共有m*n个数据...
  • 在C++中我们知道: int *ptr = new int; 这样可以动态分配一个int型指针 int *ptr = new int[3]; 这样可以动态分配一个一维数组 ...在尝试新的方法之前,我们需要首先了解二维数组在内存中的存储结构: ...
  • 二维数组作为形参传值3种方式

    千次阅读 2019-04-19 22:07:39
    在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组。而二维数组的...
  • Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因 为每一片区域都有特定的处理数据方式和内存管理方式。 栈内存  用于存储局部变量,当数据使用完,所占空间会...
  • 因为数组在内存中连续一段存储空间,所以数组一旦被创建,空间就固定了,长度是不能扩增数组的长度是固定,如果需要扩充,必须创建新数组,原数组的长度要复制到新数组中 。 java中,数组类型变量...
  • 二维数组的存储方式及其作为参数的方法二维数组A[m][n]可以视为由m个行向量组成的向量,或者是由n个列向量组成的向量。由于计算机的内存是一维的,多维数组的元素应排成线性序列后存入存储器。数组一般不做插入和...
  • Lei ❤ 二维数组

    2020-02-21 20:31:43
    具体来说一下二维数组在内存中是如何存储的呢? 1.无论是二维数组,还是多维数组,他们本身就是一个一维数组,只不过该数组的每一个元素是另一个元素数组罢了 数组是存储在堆内存中的,那么二维数组就是把多个一...
  • Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 栈 存储局部变量 局部变量 a:方法定义中或者方法...
  • 二维数组中的查找3

    2016-05-17 19:25:59
    数组: 数组是C++中基本的数据结构,它占据一块连续的内存并且按照顺序存储数字和字符。 由于数组中的内存是连续。... 此我们以二维数组为例,进行查找操作,熟悉数组的使用方式二维数组
  • 二维数组作为形参--传值3三种方式

    万次阅读 多人点赞 2018-08-25 19:59:48
    在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组。而二维数组的...
  • C语言的数组就是一些列具有相同类型(一些弱类型检查的语言比如python无需类型相同)的数据的集合,这些数据在内存中依次挨着存放,彼此之间没有缝隙。要将数据存储至数组,必须为之分配对应的存储空间。数组的定义...
  • 我们来看看C语言的数组在内存中的存储方式。 实际上C语言中的数组,实际上都是一维的。即不管是几维的,都是通过数组的数组这种方式来创建的,实际上它们在内存中的储存方式还是连续的一维数组。 那么我们再来...
  • 维数组保存一组数据类型相同数据声明一个数组: 数据类型[ ] 数组名 = 初值注意: 这里数据类型指是数组保存数据类型声明方式一: int array = new int[数组长度];注意: 数组长度一旦确定 就不能...
  • C/C++二维数组总结

    万次阅读 多人点赞 2018-12-16 16:01:29
    这样矩阵在内存中是以箭头右边的方式存放,也就是说实际上我们定义的二维数组在内存中仍然像是一维数组那样连续存储的。可以想象为把一个矩阵一层层伸展铺平。 因此可以使用如下方法定义二维数组: 方法一.....
  • 二维数组和二级指针

    千次阅读 2017-05-17 17:32:57
    二维数组在内存中按照一维的方式进行存储 二维数组中的第一维是一维数组 二维数组中的第二维是具体的值 二维数组的数组名可以看做是常量指针 array[2][4]根据选择不同可以为2行4列,也可以为4
  • 指针数组与二维数组

    2019-08-06 19:10:59
    换句话说,就是将二维数组的第0行、第1行直到最后一行依次存储一段连续的内存中,如下图所示。这就与一维数组的存储类似,也就可以用指向一维数组的指针进行操作。但是这种替代方法使得程序可读性不强,由此引入了...
  • 数组中的个元素的存储是有先后顺序的,他们在内存中按照先后顺序连续存放在一起。 数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。 数组的下标不能超出Long数据类型的有效范围 2、一维数组定义 (1)...
  • 1.二维数组在内存中的布局 一般我们都会把二维数组看做是排列在一张表格中的一行行的一维数组,但是事实上系统是决不允许程序按照这样的方式存储数据的。单个元素的存储和引用实际上是以线性的方式排列在内存中的。...
  • 大致就是把一个我们脑海里的二维数组集合,按照一定顺序排成一列存储在内存中。这一点比较简单了,如果还是有和我一样不熟悉初学者,建议翻翻书、多加巩固。知识遗忘是正常,多加巩固就好。确定了这一点,...
  • C语言二维数组作为函数参数传递

    万次阅读 多人点赞 2018-06-07 21:43:37
    二维数组在内存中是按行存放,先存储第一行,在接着存储第二行….. 二维数组作为函数参数 二维数组作为函数参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数大小,也可以省略以为大小...
  • 前面我们已经说过了数组和指针内容,现在,我们把指针内容和数组内容结合到一起来学习。 一维数组与指针 ...我们首先知道一维数组在内存中是连续存储的: int array[10] = { 1,2,3,4,5,6,7,8,9,1...
  • 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力也就是说,想法很简单,但实现起来 可能就不是那么回事了首先要知道数组在内存中的存储方式,这样才能真正理解...
  • 数组,二维数组

    2020-12-09 14:37:51
    数组 **数组:**相同数据类型元素集合 数组本身是引用数据类型,即对象,但数组可以存储基本数据类型,也可以存储引用数据类型 数组的声明 ...声明数组的同时,根据指定长度分配内存,但数组中元素

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 316
精华内容 126
关键字:

二维数组在内存中的存储方式