精华内容
下载资源
问答
  • 一维数组大小与长度 int a[10]; 1 数组大小 int size = sizeof(a) = 40; 2数组的长度 int len = sizeof(a) /sizeof(int) = 10 3数组的偏移 首先数组名代表首个元素的地址,要注意数组名是个常量,不能被赋值,a ...

    一维数组大小与长度

    int a[10];

    1 数组的大小

    int size = sizeof(a) = 40;

    2数组的长度

    int len = sizeof(a) /sizeof(int) = 10

    3数组的偏移

    首先数组名代表首个元素的地址,要注意数组名是一个常量,不能被赋值,a == &a[0] == 01(假设数组的起始地址为01)
    a + 1 == &a[0] + 1 == 05 地址加一跳过一个整形元素,即跳过4个字节
    &a + 1 = 0x01 + 10 * 4 = 41 虽然&a(二级指针)、a(一级指针) 表示的起始地址相同,但a表示数组首个元素的地址,&a表示整个数组的地址,数组的地址加1将跳过整个数组,即跳过4 * 10 个字节

    二维数组大小与长度

    int a[3][4]

    1 数组的大小

    int size = sizeof(a) = 4 * 3 * 4 = 48;

    2 数组的行

    sizeof(a) / sizeof(a[0]) = 48 / 4 * 4 = 3 (数组的大小除以每一行的大小得到行数)

    3 数组的列

    sizeof(a[0]) / sizeof(int) = 16 / 4 = 4 (每一行的大小除以每一个元素的大小得到列)

    4 数组的偏移

    a[0] 代表第0行的数组名 ,代表首个元素的地址,即等价于第0行第0个元素的地址 a[0] = &a[0][0] (一级指针)
    a 代表二维数组的数组名,代表首行的地址, 即 a = &a[0](二级指针)
    &a 代表整个二维数组的地址(三级指针)
    a[0] + 1 = &a[0][0] + 1 跳过一个整形元素
    a + 1 = &a[0] + 1 跳过一行
    &a + 1 跳过整个数组

    展开全文
  • 一维数组大小的判断

    2021-02-20 09:01:09
    指针和数组大小的判断 #include <stdio.h>... int a[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(a));//sizeof(数组名)计算的是数组的总大小 4*4=16; printf("%d\n", sizeof(a+0));//数组名不

    ##一维数组大小的判断

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	//只要sizeof(数组名)以及&数组名这两种情况时,数组名表示整个数组,其他时候数组名都表示首元素的地址
    	int a[] = { 1, 2, 3, 4 };
    	printf("%d\n", sizeof(a));//sizeof(数组名)计算的是数组的总大小 4*4=16;
    	printf("%d\n", sizeof(a+0));//数组名不是单独的,那么a表示首元素的地址,a+0也表示首元素的地址,在32位平台上为4,64位平台上为8
    	printf("%d\n", sizeof(*a));//数组名表示首元素地址,*a为首元素,sizeof(*a)的值为4
    	printf("%d\n", sizeof(a+1));//和a+0道理相同,a+1表示第二个元素的地址,为4/8
    	printf("%d\n", sizeof(a[1]));//a[1]为第二个元素,sizeof(a[1])为第二个元素大小,为4
    	printf("%d\n", sizeof(&a));//&a取出数组的地址,也是4/8
    	printf("%d\n", sizeof(*&a));//&a是数组的地址,*&a对&a进行解引用,访问整个数组,为4*4=16
    	printf("%d\n", sizeof(&a+1));//&a为数组地址,&a+1跳过整个数组,但是大小一样为4/8
    	printf("%d\n", sizeof(&a[0]));//&a[0]为首元素的地址,为4/8
    	printf("%d\n", sizeof(&a[0]+1));//&a[0]+1是第二个元素的地址也是4/8
    	system("pause");
    	return 0;**
    }
    
    展开全文
  • 1.数组在c语言中,数组可以认为是相同类型数据的集合举个例子,当我们需要计算多个数据,比如说需要计算个班级的数学成绩的平均分#include在这里定义了5个变量,代表5个学生的数学成绩,然后依次的给变量赋值,但是如果...

    1.数组

    在c语言中,数组可以认为是相同类型数据的集合

    举个例子,当我们需要计算多个数据,比如说需要计算一个班级的数学成绩的平均分

    #include

    65d3a9fd26c8df4c88c54b3d9c5b93a0.png

    在这里定义了5个变量,代表5个学生的数学成绩,然后依次的给变量赋值,但是如果学生的成绩非常多,需要的变量名也会很多,这个时候就需要考虑一下使用更科学的方法来储存数据

    #include

    922fddb97f928a47d4dd8f8885f259bf.png

    int a[5],这句话定义了一个数组,表示在内存中分配了一个可以保存5个整数的空间

    1.1 数组的定义

    数组声明的语法:

    <数据类型> <数组名>[数组长度]

    比如:

    int a[3];
    float b[5];
    char c[12];

    声明数组之后就相当于在内存当中开辟了一个连续的空间,空间的大小取决于数组的长度与数组的元素个数(数组的长度)

    数组空间的大小 = 数组类型 ✖ 数组长度

    在使用数组的时候可以利用数组名[索引]的方式使用数组的元素

    #include

    bf8639cc186c5eb1105f531a9443b4bb.png

    在使用数组的时候需要注意,声明数组的时候中括号当中的数字代表数组的元素个数,使用数组元素的时候,中括号当中的数字代表数组元素的索引(或者称为下标)

    索引的取值范围是从0开始,数组索引的最大值是数组的长度-1

    987c586bbfd972f9b7e91cb72de02033.png

    在使用数组的时候一定要注意数组索引不要越界,也就是不要使用大于等于数组长度的索引

    1.2 数组的初始化

    声明数组之后可以给数组的元素赋值

    #include

    b62142c8acb2fb0456359bdb68e8ce15.png

    也可以在声明的同时初始化数组

    #include

    在这里使用 {元素1,元素2,....} 的方式来初始化数组

    c617c894b36bf7b878be98bfb34e716c.png

    结果是相同的

    如果在声明数组的时候对元素进行初始化,可以省略掉数组的长度,数组会自动按照初始化的长度来处理

    #include

    efd9b794f9a60b7172634417d0ec0aec.png

    如果数组的长度小于初始化元素的个数,那么多余的元素就会被舍去

    #include

    eec89145fc1fa9426f84dd4cf1d8f652.png

    这里数组只包含2个元素,第三个元素a[2]是一个错误的值,初始化数组只有前两个值被赋值到了数组里

    如果数组元素的个数大于初始化的数组,那么数组多余的值会被赋值为 0

    #include

    bc9747e712f9942500dd92e883f18d4a.png

    如果想把数组的元素全部初始化为0,我们就可以这样写

    #include

    4b1c8511959575cb7c9ba93246dedfa6.png

    需要注意的是,初始化数组一定要在数组声明的时候来完成,如果是初始化一个已经声明过的数组,程序就会出错

    #include

    5dec393af1a336a8af1b4d72c808001f.png

    2 使用循环来处理数组

    使用数组带来的最大的好处就是我们可以通过利用循环工具,来批量的处理数组当中的数据

    具体的做法就是把数组元素的索引当作循环的控制变量,通过索引自增,来遍历数组当中的元素

    #include

    77ab6d7d97ab9caa86983d18f454b023.png

    第一次循环i=0,打印的是a[0]的值,第二次循环i=1,打印的是a[1]的值,...,循环次数等于数组的元素个数

    在c99之后,还支持通过变量来动态的初始化数组

    例如我们可以设计一个程序,手动输入学生的成绩,计算学生成绩的平均分

    #include

    76ef30591db2b801565e06aa87ede96c.png

    数组的操作往往回合循环联系到一起,通过循环来遍历数组的元素,是在编写程序的时候经常会用到的手段

    3 二维数组

    有的时候处理的数据并不是线性的,而是有维度的,比如说可能会处理矩阵

    如果使用1维数组的话处理数据的位置就会有一些难度,因此我们可以使用二维数组

    二维数据可以想象为一个表格,有行和列

    e7cbc7f25e00c550a4e78978a44c3878.png

    我们建立数组

    int a[3][3];

    数组的第一个索引表示行号,第二个索引表示列号

    2ec6c72449163748647eaab1555db017.png

    那么 a[0][0]就是第一行第一列的元素为1,a[2][1]就是第三行第二列的元素为8

    3.1 二维数组的初始化

    声明二维数组

    <数据类型> <数组名>[第一维长度][第二维长度]

    比如说

    int a[2][3];

    a[2][3]就是一个2行3列的二维数组,使用的时候每个维度的索引都是由0开始,最大值为长度-1,所以 数组a的保存元素从 a[0][0]到a[1][2]

    f2b19351778ecd868dde45052af3432d.png

    我们也可以把二维数组想象为一个由一维数组组成的数组

    7a7dcad99b66160deb910b93304d2e04.png

    数组a由两个数组组成,a[0],a[1] 而a[0],a[1]又分别由三个整形数据组成

    所以我们可以使用大括号的方式来给数组初始化

    #include

    505b4dd39b99d7f0c8ac9e20e012210e.png

    数组的总大小除以整数的大小,就是数组包含的元素个数

    二维数组的大小除以其中包含的一维数组的大小,就是二维数组中包含的一维数组的个数,即数组的行数

    每个一维数组的大小除以整型数据的大小,就是一维数组的长度,即数组的列数

    在初始化二维数组的时候可以省略一维数组的大括号,会自动按顺序分配每个元素的位置

    #include

    cbd1f777a57b92ca0205e78b219cc8a4.png

    结果是一样的

    如果数据的个数是明确的,那么在声明数组的时候只要指明每个一维数组的长度,可以省略二维数组的长度,即只需要指明列数可以省略行数

    #include

    89e76abe46a0987637f8a642c018001a.png

    会自动计算行数

    如果数据不够填满数组,那么剩余的部分依然会补0

    #include

    6b948a9c9f36da4279cbea23b6855787.png

    如果要初始化所有元素都为0,就可以这样写

    #include

    a4543062084e0b28465cfbcc2d79bb0f.png

    3.2 使用循环遍历二维数组

    操作二维数组就需要使用嵌套的循环,外层循环的控制变量就是数组的第一维索引,内层循环的控制变量就是数组的第二维索引

    如果我们要输出数组的所有元素

    #include

    1deb0faae3304b99fc695abd00730276.png

    同样的也存在三维以上的数组,操作方式都是一样的

    展开全文
  • 1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a 等同于 &a[0]; a+1是第二个元素的地址。比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节...
  • 维数组数组名除了两种特殊情况外,可以理解指向第一个元素的指针 两种特殊情况: sizeof数组名 对数组名取地址 int arr[5] = { 1, 2, 3, 4, 5 }; //1、当sizeof数组名时候,统计是整个数组大小 printf(...

    一维数组

    数组名是个指针常量,即指针的指向不可以修改,但指针所指向空间的值可以修改

    一维数组数组名除了两种特殊情况外,可以理解为指向第一个元素的指针

    两种特殊情况:

    • sizeof数组名
    • 对数组名取地址
    int arr[5] = { 1, 2, 3, 4, 5 };
    
    //1、当sizeof数组名时候,统计是整个数组的大小
    printf("sizeof(arr) = %d\n", sizeof(arr));
    
    //2、当对数组名 取地址的时候
    printf("%d\n", &arr);
    printf("%d\n", &arr + 1);//指针偏移了整个数组的大小20个字节,而不是对应整型指针偏移的4个字节,数组名取地址是一个数组指针
    //除了以上两种情况外 , 数组名都指向数组中的首地址
    
    int * p = arr; // 直接对int*p进行赋值,也不会报错
    
    //数组名 是个指针常量
    *arr = 10;//指针指向的值可以修改
    //arr = NULL;//指针的指向不可以修改
    

    数组中元素的引用方式:

    • 下标法:a[ i ]形式;a是数组名;i即是下标,对应数组中从前往后元素的序号
    • 指针偏移法:*(a+i)或 *(p+i);其中a是数组名,p是指向数组首地址的指针变量

    注意:下标法访问数组的实质也是指针的偏移,下标法a[ i ]是为了方便开发人员理解而形象化出来的产物,代码底层的实现依旧是指针的偏移,即a [ i ] 等价于*(a + i);

     int arr[5] = {1,2,3,4,5};
     
     printf("%d\n",a[1]);
     printf("%d\n",*(a + 1));//两种方式等价
    

    引入问题:数组下标法访问时,下标(中括号中的数值)可不可以为负数?

    int arr[5] = {1,2,3,4,5};
    
    int *p = arr;
    p = p +3;
    
    printf("%d\n",*p);
    
    printf("%d\n",*(p - 1));
    printf("%d\n",p[-1]);
    

    上述代码运行结果:
    在这里插入图片描述
    综上所述:数组下标法访问数组中元素时下标不要一概认为其是数组中元素所对应的下标序号,其实质还是指针的偏移量,中括号[]的形式只是增加了代码的可读性,要知道他的实质;

    二维数组

    设有二维数组a,有3行4列。它的定义为
    int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19.21,23)};

    a是二维数组名。a数组包含3行,即3个行元素;a[0],a[1],a[2]。而每一个行元素是一个一维数组,它包含4个元素(即4个列元素)。例如,a[0]所代表的一维数组又包含4个元素:a[0][0],a[0][1],a[0][2],a[0][3]。可认为二维数组是“数组的数组”,即二维数组a是由三个一维数组所组成的。
    在这里插入图片描述
    从二维数组的角度看,a代表二维数组首元素的地址,现在的首元素不是一个简单的整型元素,而是由4个整型元素所组成的一维数组,因此a代表的是首行(即序号为0的行)的起始地址,a+1代表序号为1的行的起始地址;a[0],a[1],a[2]既然是一维数组的数组名,从前面已知,数组名代表数组首元素地址,因此a[0],代表一维数组a[0]中第0列元素的地址,即&a[0][0] 。同理,a[1]的值是&a[1][0];假定首行的起始地址为2000,则有:
    在这里插入图片描述

    在这里插入图片描述

    总结:a[ i ][ j ] <=> * (a[ i ] + j) <=> * ( *( a + i ) + j)

    • 二维数组名 等价与 一维数组的指针
    • 除了对二维数组名 sizeof 或者 取地址以外,那么二维数组名 都是指向第一个一维数组的首地址
    void test01()
    {
    	int arr[3][3] = {
    		{1,2,3},
    		{4,5,6},
    		{7,8,9}
    	};
    //二维数组名 等价与 一维数组的指针
    //除了对二维数组名 sizeof 或者 取地址以外,那么二维数组名 都是指向第一个一维数组的首地址
    int(*pArray)[3] = arr;//数组名是一维数组指针
    //通过数组名 访问数组元素6
    	printf("arr[1][2] = %d\n", arr[1][2]);
    	printf("arr[1][2] = %d\n", *(*(pArray + 1) + 2));
    	printf("arr[1][2] = %d\n", *(*pArray + 5));
    }
    
    展开全文
  • // // main.cpp // 二维数组 // 1.个二维数组就像是若干个相同的数组放在一起,这对于存储多组...处理二维数组的时候直接当作一维数组就可以了每行都是一维数组。 // 5.二维数组在存储的时候,是按照行...
  • 一维数组 简称数组,形式为a[i],在内存中占用i个大小相等的连续空间,其中数组a为该空间的首地址,类似于&a[0],数组名不是指针,但...a[0][0],a[1]为第1行的首地址,类似于&a[1][0]。 例如: char a[4]
  • C语言总结七章、数组一维数组一维数组的定义一维数组的引用一维数组的初始化程序举例二维数组及多维数组维数组的定义二维数组元素的引用二维数组元素的初始化程序举例字符数组和字符串字符数组 七章、数组 ...
  • 用new创建多维数组时,最后需要用delete,但是我在delete时遇到了麻烦,实在不能再浪费...一维数组 int a[4] ={1,2,3,4}; 二维数组 int b[3][4] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4} 三维数组 int c[2][3][4] = {
  • 数组一维,二

    千次阅读 2020-12-08 15:30:47
    一维数组的创建和初始化(1一维数组的创建(2)数组的初始化2.数组在内存中的存储3.二维数组的创建和初始化(1)二维数组的创建(2)二维数组的初始化3.数组作为函数的参数 1.一维数组的创建和初始化 (1一维数组...
  • 1)、第一种是普通的二维数组的表示方法。 (2)、第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内存中的储存方式其实是一样的,不过使用二维数组看起来要...
  • 由于p2是指向具有10个整型元素数组的指针,所以p2+1所指向的下个元素,所以p2+1所指的下个元素,就是跳过这10个元素的下10个元素的位置,即是数组a的最后个元素a[9]之后的下个存储单元。实际上P2的值增加了...
  • C语言一维数组转换维数组

    千次阅读 2016-02-26 09:26:00
    一维转二代码示例: #include <stdio.h> #include <stdlib.h> #define ROW 3 #define COL 2 int main(int argc, char *argv[]) { int arr1D[] = {1,2,3,4,5,6}; int arr2D[ROW][COL]...
  • 参考: ... 打开 IPython ,创建 Python 的列表 a 对象。然后,使用列表生成式,创建个元素都原来两倍的新列表 a2,并统计这行的用时 921 ms。 In [95]: a =list(range(10000000)) In...
  • 一维数组创建 #include<iostream> #include<iomanip> using namespace std; const int COL = 3; void display(int *arr,int n){ for(int i=0;i<n;i++){ cout<<arr[i]<<"\t"; } cout...
  • 一维数组和二维数组知识点总结

    千次阅读 2019-11-04 16:28:40
    一维数组和二维数组知识点总结 字符数据存储的基本知识 数组指针和指针数组的区别 数组指针:int(*p)【】,首先因为 *p放在括号内优先结合,所以先是个指针,然后和【】起作用。 所以数组指针是指针,指向...
  • 我们在使用二维数组作为参数时,我们可以指明这个数组所有的数,同时我们也可以省略一维,但是二或者高维却不能省略。why呢?由于编译器原理的限制,在数组Elemtype test[m][n]中,访问test[i][j]时(也就是...
  • 开始我以为掌握了java的数组,类推至c++,不用多学的,可自己写的时候老是犯错误,还是得仔细学学,下面主要讲关于c++一维数组和二维数组的一些细节内容。 二、一维数组 定义:一维数组用于表示由固定多个 ...
  • 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新...增加了支持甘特图的mermaid语法1 功能; 增加了 多屏幕编辑 Markdown文章功能; 增加了 焦点写作
  • 数组 数组(Array)是在内存中连续存储的具有相同类型的组数据的...数组中,若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量
  • 【C语言】一维数组和二维数组

    千次阅读 2017-07-10 09:43:54
    一维数组及二维数组
  • 数组是种数据格式,能够存储多个同类型的值,位数组可以用来实现线性表的顺序存储,哈希表等,二数组可以用来保存图的邻接矩阵等。 一维数组的声明 ...定义数组a的引用: int a[5] = {1, 2, 3, 4,5}; in
  • C语言 A1—一维数组元素大小顺序排列 题目:将一维数组里面的数据从小到大按顺序排列: #include <stdio.h> #include <unistd.h>...i++)//使数组第一个元素开始比较,称为当前元素 //我们现在
  • 一维数组 定义数组:int a[5]; 此处,a,&amp;a[0]以及&amp;a做右值时在数值上是完全相同的,但含义不同。 数组a只能做右值,不能做左值。做右值是表示数组首元素首的地址,同&amp;a[0],如: ...
  • C语言 一维数组详解

    2021-10-20 18:15:51
    文章目录一维数组多角度看一维数组一维数组声明问题1:那么b的类型是什么呢?它所表示的又是什么?问题2:指针和数组是等价的吗?问题3:那么数组在什么情况下不能作为指针常量呢?下标引用问题1:`*(arr + 3) `,这...
  • C/C++数组详解(一维和二

    千次阅读 2018-11-08 18:47:36
    数组这东西,说说都懂,但是似乎并没有完全吃透,导致很多地方有疑惑。...数组的局限性:数组大小确定不变,不能随意向数组中增加元素。如果不确定元素的确切个数,使用vector。   定义和初始...
  • 维数组排序数组排序有内置API,一般是一的,这里分享下二或者多维的用法1 C++ 二维数组第一列升序,第一列相同第二列降序2 C 二维数组第一列升序,第一列相同第二列降序3 更一般的思路 数组排序有内置API,...
  • 数组运算前,先了解一下数组的解引用到底是怎么回事。 #include #include int main() { int arr[] = {1,2,3,4,5,6,7,8,9,0}; printf("%d\n", *arr); system("pause"); return 0; } 这段代码输出来...
  • 1维数组的正常定义 1.1 定义静态数组 Sub test1001() '静态数组的方法定义三维数组 Dim arr1(3, 3, 3) N = 1 For I = 1 To 3 For J = 1 To 3 For K = 1 To 3 arr1(I, J, K) = N Debug.Print "arr...
  • 数组名:第一个元素的地址5.二维数组的定义及使用1.基础定义2.二维数组的初始化3.二维数组名:4.二维数组应用案例: 1.数组基础 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,834
精华内容 44,333
关键字:

则数组a的第一维的大小为