首页 > 编程语言 >C++数组

C++数组

时间:2023-10-24 20:46:32浏览次数:31  
标签:10 arr 初始化 int C++ 数组 指针

c++数组

目录

数组是用来存储相同类型的变量的顺序集合

所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

type arrayName [ arraySize ][arraySize1];    arraySize必须是一个大于等于零的整数常量。

一维数组

声明和初始化

  • 存储数组类型
  • 数组名字
  • 数组中元素个数
type arrayName [ arraySize ];
// 整型数组
int array[12];             // 声明,数据长度
array[0]=0;
array[1]=1;
array[2]=2;

int array2[3]={20,30,5};   // 声明+初始化

编译器不会检测使用下标是否有效

int arr[10];      //arr是含有10个整型的数组
int arr[10]={};    //arr是含有10个整型的数组,进行了初始化,每个元素的值都是10
int *arr[10];     //arr是含有10个整型指针的数组
int arr[] = {1,2,3}; //arr是含有3个整型的数组
int arr[5] = {1,2,3}; //等价于int arr[5] = {1,2,3,0,0}
string arr[3] = {"hello","world"}; //等价于 string arr[3] = {"hello","world",""};
char arr[6] = "hello"; // 这里不能声明维度为5,因为字符串末尾还有一个空字符('\0'),所以应该是"hello\0"
char arr[6] = {'h','e','l','l','o','\0'}; //等价于 char arr[] = "hello";
char arr[6] = {'h','e','l','l','o'}; //这条语句和上面一条语句是一样的。默认字符初始化值是'\0'

字符串数组

//字符串数组
char str[] = "hello world!";
//与字符串的区别
//字符串   string类
string ss=("hello wrld!");

字符串数组的长度

//字符串数组的长度
char str[] = "hello world!";
int len = strlen(str);
cout << len << endl;

//另外一种结构
int len = sizeof(str) / sizeof(str[0]); //算结尾的'/0'
cout << len << endl;

访问数组中元素

int myNum[6] = {89,85,90,75,69,95};
cout << myNum[0] << endl;
// 输出89

修改数组数据

int myNum[6] = {89,85,90,75,69,95};
cout << myNum[0] << endl;
myNum[0] = 100;
cout << myNum[0] << endl;

//89
//100

遍历数组

#include <cstddef>
#include <iostream>
using namespace std;

//下标法
int main(){
    size_t size = 20;
    int arr[size] = {};
    for(size_t index=0; index < size; index++){
        cout << arr[index] << " ";
    }
    cout << endl;
    return 0;
}

// 直接结果
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#include <iostream>
#include <iomanip>

using namespace std;
using std::setw;

int main() {
    int n[5]; // n 是一个包含 10 个整数的数组

    // 初始化数组元素
    for (int i = 0; i < 5; i++) {
        n[i] = i + 100; // 设置元素 i 为 i + 100
    }

    cout << "Element" << setw(13) << "Value" << endl;

    // 输出数组中每个元素的值
    for (int j = 0; j < 10; j++) {
        cout << setw(7) << j << setw(13) << n[j] << endl;
    }

    return 0;
}

// 执行结果
Element        Value
      0          100
      1          101
      2          102
      3          103
      4          104

C++新标准提供了auto关键字

double prices[] = {5.99, 3.2, 9.99, 29.99};

for(double x: prices) {
  cout << x << endl;
}


for(auto a : arr)
    cout << a << " ";

指针遍历取值

#include <iostream>
using namespace std;
int main(){
  int nums[]={0,1,2,3,4,5,6,7,8,9};
  int i;
  for(i=0;i<=9;i++){
     cout << *(nums + i)<< endl;
      // 这种写法和下标法其实是等价的,下标法也会转换为 * (nums + i),这种写法更加接近底层
  }
  return 0;
}

指针变量指向数组元素

#include <iostream>
using namespace std;
int main(){
  int nums[]={0,1,2,3,4,5,6,7,8,9};
  int *p;
  for(p = nums;p<=(nums + 9);p++){
    cout << *p << endl;
  }
  return 0;
}

多维数组

定义和初始化

当一个数组中的元素依然是一个数组时,通常使用两个维度来定义它。
二维数组,大小为m的数组,每个数组的元素都是大小为n的数组。
三维数组,大小为m的数组,每个数组的元素都是大小为n的数组,然后大小为n的数组中的每个元素又是大小为q的数组。
    
int arr1[m][n]; 
int arr2[m][n][q];
int arr[3][4] = {  
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};

该数组有两个维度,3行和4列。

使用数组的行索引和列索引可以访问数组元素:

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
cout << seats[1][2];

嵌套循环遍历

#include <iostream>

using namespace std;

int main() {
    // 一个带有 5 行 2 列的数组
    int a[3][4] = {
            {0, 1, 2,  3},   /*  初始化索引号为 0 的行 */
            {4, 5, 6,  7},   /*  初始化索引号为 1 的行 */
            {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
    };

    // 输出数组中每个元素的值
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            cout << a[i][j] << "  ";
        }

        cout << endl;
    }
    return 0;
}

// 执行结果
0  1  2  3
4  5  6  7
8  9  10  11

指针数组

指针和数组

在c/c++语言中,数组和指针有着非常紧密的联系,在使用数组编译的时候通常会把它转化为它的第一个元素的指针。

string nums[] = {"one","two","three"};
string *p = &nums[0];             //定义了一个指针
string *p2 = nums;            //定义了一个指针

p和p2其实等价的,都是表示指向nums首元素的指针。

&a表示数组地址,其结果是指向该数组的指针

&a[0]表示数组首元素的地址,其结果是指向该数组首元素的指针

int *ptrs[10];            //声明了一个数组,含有10个整形指针
int (*ptr)[10] = &arrar;  //ptr是一个指向数组的指针
int (&ref)[10] = array;   //ref是一个数组的引用
int *(&ref)[10] = array;  //ref是一个元素为指针的数组的引用
#include <stdio.h>
#include <stdlib.h>
int main()
{
   int a[3][4] = { { 0, 1, 2, 3 },{ 4, 5, 6, 7 },{ 8, 9, 10, 11 } };
   int(*p)[4];
   p = a;
   printf("%d,%d,%d,%d\n", sizeof(*(p)),sizeof(*(p + 1)),sizeof(*(p + 2)),sizeof(*(p + 3)));
 
   printf("%d\n", **p);//a[0][0]
   printf("%d\n", *(*(p + 1)));//a[1][0]
 
   system("pause");
   return 0;
}

动态数组

数组大部分情况下是知道数组长度的,一旦定义了数组,系统会为他分配一个固定大小的内存,以后不能改变,这种数组叫做静态数组

动态数组是从堆上分配的空间,在执行过程中进行分配,所以叫做动态数组。

动态数组的内存由程序员申请,所以应该由程序员手动释放。

int n;
scanf("%d",&n);          //手动输入数组长度

int* parr = new int[n];    //动态申请数组内存
......             //进行必要的操作
delete[] parr;       //手动释放申请的内存

参考资料

https://www.cjavapy.com/article/1793/

标签:10,arr,初始化,int,C++,数组,指针
From: https://www.cnblogs.com/tian777/p/17785704.html

相关文章

  • C++ char String
    C++charstring目录C++charstring字符char字符数组遍历基本函数字符比较char*、char[]转换为string字符串String类1.声明和初始化2.string的大小和容量3.拼接append()&+操作符4.插入push_back()&insert()5.string字符串遍历6.string删除erase()7.string查找与替换7.排序字......
  • C++指针基础
    指针基础目录指针基础引用定义和访问案例内存空间空指针和野指针const修饰指针指针之间的赋值通过指针改变原数据值指针和数组案例1案例2说明指针和函数动态内存指针潜在危险产生的原因:危害规避参考资料引用引用变量是对现有变量的引用,它是使用&运算符创建的:stringfood="......
  • 2023-10-24 react+ts 遍历双重对象嵌套数组
    useEffect(()=>{if(value){constarr=value;for(constkinarr){console.log(k,arr[k]);arr[k].key=arr[k].id;arr[k].title=arr[k].name;for(constk2inarr[k].children){arr[k2]......
  • 数组的拷贝与扩容
    数组的拷贝与扩容拷贝首先需要两个数组需要知道从哪里拷贝到哪里,拷贝多长//需求:从源数组里面拷贝第二个数组-第五个数组,到目标数组里面publicclassArrayCopyDemo{publicstaticvoidmain(String[]args){//源数组int[]ages={14,25,36,1......
  • 【每天例题】蓝桥杯 c++ 卡片
    卡片题目小蓝有k种卡片,—个班有n位同学,小蓝给每位同学发了两张卡片,—位同学的两张卡片可能是同一种,也可能是不同种,两张卡片没有顺序。没有两位同学的卡片都是一样的。小蓝有k种卡片,-个班有n位同学,小蓝给每位同学发了两张卡片,-位同学的两张卡片可能是同一种,也可能是不同种,......
  • 【每日例题】蓝桥杯 c++ 奇数倍数
    奇数倍数题目本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。请你找到最小的整数X同时满足:1.X是2019的整倍数;2.X的每—位数字都是奇数。运行限制·最大运行时间:1s·最大运行内存:128M蓝桥杯奇数倍数题目分析针对这个题目,要判断两个条件:1.这个数......
  • C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例
    相关源码测试用例下载包括4个压缩包,初始代码,实现前缀和,实现前缀积,实现前缀异或。都是在前者的基础上修改的。原理长度为n的数组nums,共有n+1个以nums[0]开始的子数组。索引范围分别为[0,i),i取值区间[0,n]。preSum[i]记录子数组[0,i)的和。比如:nums={1,2,3,4},则preSum={0,1,3,6......
  • C++前缀和算法应用:和至少为 K 的最短子数组的原理、源码及测试用例
    题目给你一个整数数组nums和一个整数k,找出nums中和至少为k的最短非空子数组,并返回该子数组的长度。如果不存在这样的子数组,返回-1。子数组是数组中连续的一部分。示例1:输入:nums=[1],k=1输出:1示例2:输入:nums=[1,2],k=4输出:-1示例3:输入:nums=......
  • C++前缀和算法:构造乘积矩阵
    题目给你一个下标从0开始、大小为n*m的二维整数矩阵grid,定义一个下标从0开始、大小为n*m的的二维矩阵p。如果满足以下条件,则称p为grid的乘积矩阵:对于每个元素p[i][j],它的值等于除了grid[i][j]外所有元素的乘积。乘积对12345取余数。返回grid的乘积......
  • C++算法:二叉树的序列化与反序列化
    #题目序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行逻......