首页 > 其他分享 >数组

数组

时间:2023-04-14 18:39:16浏览次数:35  
标签:初始化 arr int 元素 数组 main

一维数组的创建和初始化

数组是一组相同类型元素的集合。数组的创建方式

type_t           arr_name    [const_n]分别对应着

数组类型       数组名         数组的元素大小(指定常量表达式)

数组的创建例子,创建一个整型数组

#define _

#include<stdio.h>

int main()
{        
        int arr[10];//一个int类型的 叫arr的包含10个元素大小的数组
       return 0;//这就是数组的创建
}

一维数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始化值

#define _

#include<stdio.h>

int main()
{
      int arr[10] = {1,2,3};//不完全初始化,剩下的元素默认初始化为0
      char arr2[5] = {'a', 'b'};//字符类型的不完全初始化,剩下的元素也默认初始化为零
       char arr3[5] = "ab";//这样也可以初始化,元素分别为a,b,/0剩下的都是0
       char arr4[] = "abfdef"
  
           return 0;
}

sizeof与strlen

int main()
{     
        int arr4[] = "adcdef"
        printf("%d\n", sizeof(arr4));//7,计算空间大小,/0也占
        printf("%d\n", strlen(arr4));6 ,计算字符串长度,/0不算
     return 0;
}

sizeof     计算变量,变量,数组,类型所占空间的大小,单位是字节

sizeof,是操作符

strlen     求字符串长度 只能针对字符串  ,遇到/0就停止,他是库函数

int main()
{ 
        int arr1[] = "abc";//这种初始化方式算是放了四个元素
        int arr2[] ={'a', 'b', 'c'};//而初始化是这种方式算是放了三个元素
         printf("%d\n", sizeof(arr1));//这里的答案是4
         printf("%d\n", sizeof(arr2));//sizeof只关心大小所以这里答案就是3
         printf("%d\n", strlen(arr1));//这里答案就是3
         printf("%d\n", strlen(arr2));//这里的答案就是随机值,arr2的初始化方式不包括/0
      return 0;
}

一维数组的使用

对于数组的使用有一个操作符:[]   下标引用操作符,用来访问数组元素的操作符

int main()
{
      char arr[] = "abcdef";//对于我们的元素,每个元素都有对应的下标,从0开始递增1
  //比如我们要求一个元素‘d’的元素
       printf("%c\n", arr[3]);//这样就可以打印出
        return 0 
}

如果我们要全部打印字符,则可以利用for循环全部打印

#define _

#include<stdio.h>

int main()
{
           char i = 0;//首先创建一个变量//int len = strlen(arr);
            //for(i=0; i<len; i++)也可以这么写
             // 
           for(i=0; i<6; i++)//从0开始打印到下表为5的元素停止,当然也可以这样for(i=0; i<(int)strlen(arr); i++))
           {
                printf("%c ", arr[i]);//abcdef
           }
         return 0;
}

如果要打印全部字符数组

#define _

#include<stdio.h>

int main()
{
             int arr[] = {1,2,3,4,5,6,7,8,9,};
              int sz = sizeof(arr)/sizeof(arr[0]);//要全部打印首先得真知道元素个数
             int i = 0;//
        for(i=0; i<sz; i++)//
        {
                printf("%d ", arr[i]);
        }
             return 0;
}

一维数组在内存中的存储

一维数组在内存中是连续存放的

二维数组的创建和初始化

int main()
{
         int arr[3][4];//代表创建了3行和4列,二维数组以几行几列的形式写
            return 0;
}

二维数组的初始化

int main()
{
         int arr[3][4] = {1,2,3,4,5};//也是不完全初始化,5会出现到第二行的数组里,第二行的分别就是5,0,0,0
  //代表创建了3行和4列,二维数组以几行几列的形式写//二维数组的不完全初始化,剩下元素也是为0
  //如果我要把1,2,3放在第一行,4,5放在第二行,我就要用代码块把他括起来例如
           int arr[3][4] = {{1,2,3},{4,5}};//这样第一行分别就放这1,2,3,0第二行放4,5,0,0
            return 0;
}

在二维数组中可以省略行但是不能省略列

二维数组的使用

二维数组的使用也是通过下标的方式来使用

假如我要访问二维数组里的某个元素,则我就要锁定他的行和列,行和列的下标分别也是从0开始

#include<stdio.h>

int main()
{
         int arr[][] = {{1,2,3},{4,5}};
         int i = 0
           for(i=0; i<3, i++)//首先for循环行,确定行
           { 
             int j = 0;
             for(j=0; j<4; j++)//然后在行内部确定列
             {
                  printf("%d\n",arr[i][j]);//打印行列,这时候就会打印出(1,2,3,0)(4,5,0,0)(0,0,0,0)
             }
             
           }
       return 0;
}

二维数组在内存中的存储

二维数组在内存中的存储也是连续存放的,如果知道了首元素的地址就能找到个各个元素的地址

可以想象为二维数组是由一维数组组成的

#define _

#include<stdio.h>

int main()
{
          int arr[i][j] = {{1,2,3},{4,5}};
           int i = 0;                
          for(i=0; i<3; i++)
          {
               int j = 0;
                for(j=0; j<4; j++)
                {
                     printf("&arr[%d][%d] = %p\n", &arr[i][j]);
                }//打印二维元素的各个地址
          }
           return 0;
}

数组作为函数参数

往往我们写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序,函数将一个整型数组排序。

#define _

#include<stdio.h>
void bubble_sort(int arr[], int sz)//arr是首元素的地址
{
    //确定冒泡排序的趟数 每趟就是n,多趟就是n-1 ,所以就是元素个数减一,sz-1
    int i = 0;
   
     for(i=0; i<sz - 1; i++)
     {
            //每一趟冒泡排序
         int j = 0;
         for(j=0; j<1-i; j++)
         {
             if(arr[j] > arr[j+1])
             {
                     int tmp = arr[j];
                     arr[j] = arr[j + 1];
                     arr[j+1] = tmp;
             }
         }
     }
}
int main()
{
          int arr[] = {9,8,7,6,5,4,3,2,1,0};
          //将arr进行排序,排成升序
           int i = 0;
           int sz = sizeof(arr)/sizeof(arr[0]);//10//在这里算元素的个数然后在传参
       //arr是数组 ,我们对数组进行传参,实际上是传递过去的是首元素arr[]的地址
           bubble_sort(arr,sz);//冒泡排序函数
       for(i=0; i<sz; i++)
       {
          printf("%d ", arr[i]);
       }       
           return 0;
}

数组名是什么

数组名就是我们的首元素地址(有两个除外)sizeof()和&(数组名)

#define _

#include<stdio.h>
int main()
{
             int arr[] = {1,2,3,};
               printf("%p\n", arr);//这里则会打印首元素的地址
               printf("%p\n", &arr[0]);//这里也会打印首元素的地址,与第一种方式是等价的
               printf("%d\n", *arr);//把arr解引用,结果就是1,就能证明数组就是首元素的地址   
            return 0;
}

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

2.&(数组名)的时候,数组名代表整个数组,&数组名,取出的是整个数组名的地址,虽然与arr,&arr[0],取出的地址相同,但是,&(数组名),代表的是数组的地址,只是从1的首元素地址开始,但他代表着整个数组的地址,整个数组是从1的地址开始

下标为0的元素叫做首元素




标签:初始化,arr,int,元素,数组,main
From: https://blog.51cto.com/u_16031366/6190757

相关文章

  • 用 Go 剑指 Offer 56 - I. 数组中数字出现的次数
    一个整型数组nums里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例1:输入:nums=[4,1,4,6]输出:[1,6]或[6,1]示例2:输入:nums=[1,2,10,4,1,4,3,3]输出:[2,10]或[10,2]限制:2<=nums.length......
  • 调整数组顺序使奇数位于偶数前面
    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例:输入:nums= [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4]也是正确的答案之一。提示:0<=nums.length<=500000<=nums[i]<=10000int*exchange(int*nums,......
  • LeetCode 108.将有序数组转换成二叉搜索树
    1.题目:给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。示例1:输入:nums=[-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,......
  • JSTL遍历数组,List,Set,Map等集合
    <%int[]ages={1,2,3,4,5};//普通数组,JSTL直接使用JSP赋值表达式来取List<String>names=newLinkedList<String>();//Listnames.add("Biao");names.add("彪");names.add("雷");request.setAttribu......
  • HashMap内部的bucket(桶)数组长度为什么一直都是2的整数次幂?
    这样做有两个好处:第一,可以通过(table.length-1)&key.hash()这样的位运算快速寻址,第二,在HashMap扩容的时候可以保证同一个桶中的元素均匀的散列到新的桶中,具体一点就是同一个桶中的元素在扩容后一半留在原先的桶中,一半放到了新的桶中。......
  • 数组元素排序(一)
    算法概述定义      排序:假设含有n个记录的序列为{R1,R2,...,Rn},其相应的关键字序列为{K1,K2,...,Kn}。将这些记录重新排序为{Ri1,Ri2,...,Rin},使得相应的关键字值满足条Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。      通常来说,排序的目的是快速查找......
  • Oracle_数组
     Oracle数组一般可以分为固定数组和可变数组集合:是具有相同定义的元素的聚合。Oracle有两种类型的集合:可变长数组(VARRAY):可以有任意数量的元素,但必须预先定义限制值。嵌套表:视为表中之表,可以有任意数量的元素,不需要预先定义限制值。在PL/SQL中是没有数组(Array)概念的。但是如果程......
  • rust数组
    概述rust中数组分为两类:长度固定的array动态数组vectorarray的效率比vector高,array存栈上,vector存堆上arrayfnmain(){//[类型;长度]leta:[i32;5]=[1,2,3,4,5];}数组元素类型要统一,长度要固定数组快速初始化rust下面这种初始化,针对有//类似memset(arr......
  • 【前缀和】LeetCode 1031. 两个非重叠子数组的最大和
    题目链接1031.两个非重叠子数组的最大和思路代码classSolution{publicintmaxSumTwoNoOverlap(int[]nums,intfirstLen,intsecondLen){//求一个前缀和for(inti=1;i<nums.length;++i){nums[i]+=nums[i-1];}......
  • 【DP】【分治】LeetCode 53. 最大子数组和
    题目链接[https://leetcode.cn/problems/maximum-subarray/description/](53.最大子数组和"https://leetcode.cn/problems/maximum-subarray/description/")思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数......