数组
- 数组的定义:数组是具有一定顺序关系的若干对象的集合体,组成数组的对象为该数组的元素。
- 每个元素有n个下标的数组称为n维数组
- 数组的声明和使用
- 数组的声明:a.确定数组的名称 b.确定数组元素的类型 c. 确定数组的结构(包括数组维数,每一维数的大小)
- 数组的使用:注意点为:a.数组元素的下标表达式可以是算数表达式,结果必须为整数 b.数组元素的下标不能越界
- 数组作为函数的参数使用
例子参考如下
#include<iostream>
using namespace std;
void rowSum(int a[][4],int nRow)//定义函数rowSum,数组a作为函数的参数
{
for(int i=0;i<nRow;i++)
{
for(int j=0;j<4;j++)
{
a[i][0]+=a[i][j];// 计算二维数组a每行元素值之和,
}
}
}
int main()
{
int table[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
cout<<table[i][j];//输出table二维数组
rowSum(table,3);//调用函数
for(i=0;i<3;i++)
cout<<"Sum of row "<<"is "<<table[i][0]<<endl;
}
指针
- 指针变量的声明
- 指针变量是用于存放内存单元地址的。
2. 声明指针的语法形式是: 数据类型 * 标识符; - 与地址有关的运算 “*”和“&”
- “*“”符号是取指针变量的值,“&“是取指针变量的地址,
- 指针变量的赋值,情况a.如果是赋给一个简单的变量为(int型,double型,float型)通常有 int *p=&b;(指针变量的赋值操作) ,情况b.,如果是赋给一个数组或者字符串,则为 int a[10], int *ptr=a;
数组名实际上就是一个不能被赋值的指针,即为指针常量
- 指针类型注意点
- 可以声明指向常量的指针,此时不能通过指针来改变所指向对象的值,但指针本身可以改变,可以指向其他的对象
int a;
const int *p1=&a //p1是指向常量的指针
int b;
p1=&b //正确,p1本身的值可以改变(变量的值可以改变)
*p1=1;//错误,不能通过平改变所指向的对象
2. 可以声明指针类型的常量,这时候指针本身的值不能被改变
int *const p2=&a ;
p2=&b ;错误,p2是指针常量,值不能改变
- void类型指针,可以存储任何类型的对象地址,就是说任何类型的指针都可以复制给void 类型的指针变量,经过任何类型显示转换,通过void 类型的指针便可以访问任何类型的数据`
#include<isotream>
using namespace std;
int main ()
{
//void voidObject;//错误,不能声明void类型的变量
void *pv; //对,可以声明 void 类型的指针
int i=5;
pv=&i;
int *pint =static_cast<int *>(pv); // void 类型指针指向整形变量
cout<<"* pint="<<* pint<<endl;
return 0;
}//输出的结果是 :*pint=5;
// void 指针一般只在指针所指向的数据类型不确定的时候使用
- 用指针处理数组元素
- 直接用代码作为例子比较明显
如:设有一个int 型数组 a,有 10个元素 ,用3 种方法输出这个数组
方法一:
- 直接用代码作为例子比较明显
#include<isotream>
using namespace std;
int main()
{
int a[10]={1,3,4,6,22,12,23,45,67,81};
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
} //使用数组名和下标
方法二:
#include<isotream>
using namespace std;
int main()
{
int a[10]={1,3,4,6,22,12,23,45,67,81};
for(i=0;i<10;i++)
cout<<*(a+i)<<" ";
cout<<endl;
return 0;
}
//使用数组名和指针运算
方法三:
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,3,4,5,22,12,23,45,67,81};
for(int *p=a;p<(a+10);p++)
cout<<*p<<" ";
cout<<endl;
return 0;
}
//通过指针变量
- 用指针作为函数参数
#include
using namespace std;
//将实数x 分成整数部分和 小数部分
void splitFloat(flat x,int *intPart ,float * fracPart
{
*intPart=static_cast(x);//取x 的整数部分
*fracPart=x-*intPart;//取 x 的小数部分
}
- 动态内存分配
在c++中动态内存的申请为 new,释放为 delete,在c中动态内存的申请为 malloc ,释放为 free
动态创建对象如下:
#include<iostream>
using namespace std;
class Point
{
public:
Point ():x(0),y(0)
{
cout<<"Default Constructor called."<<endl;
}
Point (int x,int y):x(x),y(y)//构造函数
{
cout<<"Constructor called."<<endl;
}
~Point()//析构函数
{
cout<<"Destructor called."<<endl;
}
int getX() const // 常成员函数,const 可以放在后面也可以放在前面
{
return x;
}
int getY() const
{
return y;
}
void move(int newX,int newY)
{
x=newX;
y=newY;
}//move成员函数的初始化
private:
int x,y;
};
int main()
{
cout<<"Step one:"<<endl;
Point *ptr1=new Point;//动态创建对象,没有给出参数列表,因此调用默认构造函数
delete ptr1;//创建对象,自动调用析构函数
cout<<"Step two :"<<endl;
ptr1=new Point(1,2);//动态创建对象,并给出参数列表,因此调用有形参的构造函数
delete prt1;//删除对象,自动调用析构函数
}
-
用vector创建数组对象
- 用vector 定义动态数组的形式为 :vector<元素类型>数组对象名(数组数组长度)
int x=10;
vector arr(x);
- 用vector 定义动态数组的形式为 :vector<元素类型>数组对象名(数组数组长度)
-
字符串
- string 类型,字符串与数组的区别是字符的长度,字符串后面的结尾为’\0’;
- c++中字符串的读入方法有
(cin、cin.get()、cin.getline()、getline()、gets()、getchar()))
不同方法的输入和输出的数据的长度和类型都是不一样的