c++学习-数组

时间:2023-03-09 15:17:10
c++学习-数组

int a[10]; //是个元素,在windows下回报错,linux会输出一个随机数

int a[10]={1,2}; //初始化,其他的为0

数组越界:

为了调高效率, 编译器不会对数组越界做检查

#include <iostream>
using namespace std; int main()
{ int b[];
int a[];
b[] = ; cout<<b[]<<endl;
cout<<a[]<<endl; return ;
}

int a[10]; // 自动生成一个指针,该指针指向数组的第一个元素的地址  int *a=&a[0];

数组的传递:

void test(int []);//简要数组声明
void test(int [10]);//标准数组声明
void test(int *a);//指针声明

数组对象:

#include<iostream>
using namespace std; class area{
public:
area(){}
area(int w, int h){ this->w = w; this->h = h; cout << "gouzao" << endl; }
~area(){ cout << "xigou" << endl; }
int get()
{
return w*h;
}
private:
int w;
int h;
}; int main()
{
area a[] = {area(,),area(,)}; cout << a[].get() << endl; return ; }

指针数组:

#include<iostream>
using namespace std; class area{
public:
area(){ cout << "gouzao:" <<endl; }
area(int i){ this->i = i; cout << "gouzao:" << i << endl; }
area(int w, int h){ this->w = w; this->h = h; cout << "gouzao" << endl; }
~area(){ cout << "xigou "<<i << endl; }
int get()
{
return w*h;
}
private:
int w;
int h;
int i;
}; int main()
{
area *p[];//指针数组
int i;
for (i = ; i < ; ++i)
{
p[i] = new area(i);
} //释放内存
for (i = ; i < ; ++i)
{
delete p[i];
} return ; }

优化后:

#include<iostream>
using namespace std; class area{
public:
area(){ cout << "gouzao:" <<endl; }
area(int i){ this->i = i; cout << "gouzao:" << i << endl; }
area(int w, int h){ this->w = w; this->h = h; cout << "gouzao" << endl; }
~area(){ cout << "xigou "<<i << endl; }
int get()
{
return w*h;
}
void set(int w, int h)
{
this->w = w;
this->h = h;
}
private:
int w;
int h;
int i;
}; int main()
{ area *p = new area[]; //在堆中创建连续的五个对象,并将第一个对象的地址赋值给指针 p
int i; for (i = ; i < ; i++)
{
p[i].set(i,i);
} delete []p; //特有的删除方式 return ; }

枚举常量和数组:

int main()
{ enum day{mon, tue, wen, thur ,fri,sat, sun};
double tempature[sun + ] = { , , , , , , }; int i;
for (i = ; i <= sun; i++)
{
cout << "xingqi " << i << "\t" << "qiwen:" << tempature[i] << endl;
} }

有 \0 直接输出数组名即可

int main()
{ char c[] = {'a','b', '\0'}; //cout << sizeof(c) << endl;
cout << c << endl; return ; }
int main()
{ char c[]; //cin >> c; //不检查是否越界,遇到空格会结束
//gets(c); //不检查是否越界,会接收所有的字符
cin.get(c,);//解决上面问题 cout << sizeof(c) << endl;
//cout << (int)c[2] << endl;
//cout << (int)c[0] << endl; return ; }

strcat

int main()
{ char a[] = "ab";//注意第一个要足够的大
char b[] = "cd"; strcat(a, b); //连接时第一个字符串末尾的 '\0' 会自动去掉 cout << a << endl;
cout << sizeof(a) << endl; return ; }

strcpy

int main()
{ char a[] = "ab";
char b[] = "cd"; strcpy(a,b); //b可以是一个字符串,注意a要足够大
//strcpy(a, "def"); cout << a << endl;
cout << sizeof(a) << endl; return ; }

strcmp

int main()
{ char a[] = "ab";
char b[] = "ab"; if (strcmp(a, b) == ) // strcmp("a", "b")
{
cout << "equal"<<endl;
} return ; }

重载[]运算符解决数组越界问题:

class A{
public:
A(int len){ this->len = len; p = new char[len]; }
~A(){ delete[]p; p = ; }
char & operator[](int i)
{
if (i< || i>=len)
{
cout << "越界" << endl;
return *(p + len - );
}
else{
return *(p + i);
}
}
private:
int len;
char *p; }; int main()
{
A a(); int i;
char *p = "abcdefghkjklmn";
for (i = ; i < ; ++i)
{
a[i] = *(p + i);
} for (int j = ; j < ; j++)
{
cout << a[j] << endl;
} return ; }