天天看点

c++学习笔记8 ——数组

  1. 数组也是存放类型相同的对象的容器。数组的大小确定。不能随意往数组中添加元素。
  2. 数组的维度必须是一个常量表达式。类型为const、constexpr
  3. 定义:定义数组的时候必须指定数组的类型,不允许使用auto关键字推断
  4. 初始化:数组元素的初始化全是用{}的,除了char的数组可以"".

    const unsigned sz = 3;

int a[sz] = {0,1,2};//列表初始化等同于int a[]={0,1,2};
int b[sz] = {"0","1","2"};//列表初始化

string c[sz] = {"hi","ha"};
           

注意:1)列表初始化可以忽略数组的维度

2) 初始化的时候,初始值从首位开始依次初始,后面未初始化的为默认值

3)字符数组的初始化可以使用字符串字面值,此时要注意空字符

如:

char a1[] = {'c','b','v'};//维度为3,列表初始化,无空字符
char a2[] = {'c','b','v','\0'};//维度为4,列表初始化,含有空字符
char a3[] = "cbv”;//维度为4,自动添加空字符

const char a4[6] = "abcdef";//错误,没有空间存放空字符
           

注:单括号括起来的一个字符 —— char型字面值

双括号括起来的零个或者多个字符 —— 字符串型字面值

  1. 数组不允许直接拷贝和赋值。vector允许。
  2. 复杂的数组声明:由内向外阅读
int *p[10];//p是含有10个整型指针的数组。
int &r[10] = ...;//错误,不存在引用的数组

int (*p)[10] = &arr;// p是个指针,p指向一个含有10个整型的数组
int (&r)[10] = arr;//r是个引用,引用的对象是含有10个整形的数组
int *(&arr)[10] = ptr;//arr是一个引用,对含有10个整形指针的数组的引用
           
  1. 访问数组元素:

    数组的下标的类型是size_t,与机器相关的无符号类型。

    当需要遍历数组元素的时候,可以使用范围for循环。

    需要注意的是:和string、vector一样,要注意下标的范围,防止溢出。

  2. 指针与数组

    1)对数组的元素使用取地址符就能得到指向该元素的指针。

string a[10] = {"heoo","hahha","123","ahdah"};
string * p = &a[2];//注意指针类型必须一致
cout<<*p<<endl;//输出的是123
           

2)使用数组名,编译时,会自动替换到一个指向数组首元素的指针。

int b[] = {0,1,2,3,4,5};
auto b1 (b);//b1是一个指针,指向b的第一个元素
           
  1. 指针与迭代器

    与迭代器一样,不能对尾后的指针进行解引用和递增的操作

    1)标准库函数begin和end

    使用和vector略有不同,数组不是类类型,所以不是成员函数,而是将数组作为参数。如:

int c[] = {0,1,2,3,4,5};
int *beg = begin(c);//返回指向首元素的指针
int *last = end(c);//返回指向为元素后一位置的指针
           

2)指针运算

解引用、递增递减、比较、与整数相加、指针相减(所得的类型是ptrdiff_t标准库类型,带符号类型)

注:只有在两个指针指向同一数组的元素,或尾位置的下一位置,时,才可以做比较

3)解引用:

int a[] = {1,3,5,7,9};
int *p = a;//*p=1
int *p1 = p+1;//*p1=3
int p2 = *(p+1);//p2=3
int p3 = *p+1;//p3=2
           
  1. 下标与指针

    标准库类型限定使用的下标必须是无符号型,内置的类型(数组)的下标为有符号类型

  2. 例子1

    要求:写一段程序,利用指针将数组中的元素置0

    例子2:写一段程序比较2个数组是否相等,

1)

int  a[] = {0,1,2,3,4,5,6};
int *p =a;
end = end(a);
for(p=a;p!=end;++p)
*p = 0;
for(auto j : a)
cout<<j<<endl;
           

2)随机生成的数组和用户自己输入的数组相比较

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{	const int sz = 5;
   int a[sz],b[sz];
   srand( (unsigned) time (NULL) );//生成随机数种子。依据程序执行的时间
 for (int i=0;i<sz;++i)
 a[i] = rand() % 10;//生成10以内的整数,赋给a数组

for(auto j : a)
cout<<j<<" ";//输出随机数的数组a
 
 int  val;//怎么输入一个数组
cout<<"请输入:"<<endl;
for(int i =0;i<sz;++i)
if(cin>>val)
b[i] = val;
cout<<"你输入的数组为:"<<endl;
for( auto j : b)
cout<<j<<" ";
cout<<endl;

int *p=a;
int *p1=b;

while(p!=end(a)&&p1!=end(b))//当用for循环很难写清时,考虑while循环
{   if(*p!=*p1)
     { cout<<"不等"<<endl;
       return -1;//此处的return 语句很重要,终止循环。
      }
       p++;//这个比较的顺序逻辑很重要
       p1++;
}
cout<<"相等"<<endl;

}
           
c++

继续阅读