一维数组创建
#include<iostream>
#include<iomanip>
using namespace std;
const int COL = 3;
void display(int *arr,int n){
for(int i=0;i<n;i++){
cout<<arr[i]<<"\t";
}
cout<<endl;
}
// 函数外部,默认以0初始化
int arr[10];
int main() {
// 一维数组动态创建
int N = 10;
//对非动态创建的数组
// 1.使用int q[10]={0};可以将其用0初始化
// 2.若使用其他数字会出现不确定的结果
// 3.在函数内部使用:int q[10]; 而不初始化,会出现不确定的结果
// 4.但是在方法函数外部, 使用int q[10]; 则会默认以0初始化
int q[10] = {0};
//输出全是0
display(q,N);
//输出全是0
display(arr,10);
//动态创建一维数组, 默认用0初始化
int *ptr = new int[N];
//输出全是0
display(ptr,N);
for(int i=0;i<10;i++){
//赋初值
ptr[i] = i;
}
display(ptr,N);
}
一维数组类型的参数传递与输出
#include<iostream>
#include<iomanip>
using namespace std;
//声明函数类型,参数为一维数组
void display(const int [],int);
int main() {
int inum = 10;
// 类型推断,也可以直接进行自动转换
float fnum = static_cast<float>(inum);
// cout<<fnum<<endl;
int a[3]={1,2,3};
// 一维数组参数传递
display(a,3);
}
//函数参数为const,则不能修改
//或者 display(const int *x,int n)
void display(const int x[],int n){
for(int i=0;i<n;i++){
// 设置域宽,计算宽度把输出内容也算在里面
// 默认左对齐,循环输出则需要放在里面,当setw放在输出内容后面时,则先输出后再计算宽度
cout<<x[i]<<setw(10);
}
cout<<endl;
}
二维数组创建
主要包括非动态数组的创建,动态数组的创建
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
using namespace std;
//这里是二维动态数组,分配的空间不是连续的
//必须是动态分配的才能传入 **p这种形式的参数
void display(int **p, int row,int col) {
for(int i=0; i<row; i++) {
for(int j=0; j<col; j++) {
cout<<p[i][j]<<"\t";
}
cout<<endl;
}
}
//第一种方式:空间不连续
int test() {
const int ROW = 2;
const int COL = 3;
//非动态创建,ROW,COL必须是const为常数
int arr[ROW][COL];
//动态创建
int **ptr = NULL;
int drow=2,dcol=3;
//分配行
ptr = new int *[drow];
//传入时间作为随机数种子,每次运行结果都会不同
srand(time(0));
for(int i=0; i<drow; i++) {
//分配列
ptr[i] = new int[dcol];
//赋值
for(int j=0; j<dcol; j++) {
// 用随机数初始化
ptr[i][j] = rand()%100+1;
// cout<<ptr[i][j]<<"\t";
}
}
//二维动态数组输出方式
display(ptr,drow,dcol);
//动态分配的数组需要删除
for(int i=0; i<drow; i++) {
delete []ptr[i];
}
//分配的空间要逐一删除
delete []ptr;
}
//第二种方式,空间连续
void test_2(){
int row = 4;
int col = 3;
int **p = new int *[row];
//p[0]看作首地址
p[0] = new int[row*col];
//依次分配 p[1],p[2]...空间
for(int i=1;i<row;i++){
p[i] = p[i-1]+col;
}
//使用
int k = 0;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
p[i][j] = k;
k += 1;
}
}
//输出结果
// for(int i=0;i<row;i++){
// for(int j=0;j<col;j++){
// cout<<p[i][j]<<"\t";
// }
// cout<<endl;
// }
//空间是连续的直接删除
delete []p[0];
// 动态分配,所以第一个参数可传入指针
display(p,row,col);
}
int main() {
// test();
test_2();
}
二维数组类型的参数传递与输出
主要有两种参数传递主要有两种方式:
- 指定列的大小进行参数传递
- 使用一维数组方式传递
#include<iostream>
#include<iomanip>
using namespace std;
void show(float a[][3],int);
void show_2(float *p, int row,int col);
const int COL = 3;
int main() {
// 二维数组参数传递及输出
float b[2][COL] = {{3.14159,2.732,5.256},{3.333,4.44,5.77}};
show(b,2);
// 二维数组变为一维数组输出
// show_2(b[0],2,COL);
}
//二维数组,COL参数与实际的一致,必须是数字或const类型
//这个数组不是动态分配,不能使用形如show(float **a,int row,int col)这种形式,因为这个不能直接转为指针
void show(float a[][COL],int row){
for(int i=0;i<row;i++){
for(int j=0;j<COL;j++){
cout.width(10);
// 设置为定点小数格式,保留2位小数点,输出刑如:3.14
// cout<<setiosflags(ios_base::fixed)<<a[i][j];可简化为fixed
cout<<fixed<<setprecision(2)<<a[i][j];
}
cout<<endl;
}
// 设置对齐方式,设置左对齐
// cout<<setiosflags(ios_base::left)<<endl;
// 清除左对齐
// resetiosflags(ios_base::left);
}
//二维数组输出变为一维数组输出
void show_2(float *p, int row,int col){
for(int i=0;i<row*col;i++){
cout<<*p++<<"\t";
if((i+1)%col==0){
cout<<endl;
}
}
}