一、 二维数组
1> 初始化
int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 里面的括号是 {} , 而不是()
2> 将二维数组当做一维数组处理
// void Func(int array[3][10]) 相当于
// void Func(int array[][10]) 可变为
// void Func(int **array, int RowSize, int LineSize);
// *( (int *)array + i * LineSize + j ); 即把二维数组当作一维数组来处理
void print_array( int * p, int row, int line)
{
for(int i=0; i<row; ++i)
{
for(int j=0; j<line; ++j)
{
printf("%d ", *( p + i * row + j ) ); // 相当于 *( *(p+i) + j ); // p[i][j]
// cout << stew(3) << a[]
}
}
}
// 调用
print_array( (int *)a, 3, 3 );
3> 二维数组当二维数组使用
void WordSort(char p[][10], int row)
{
char temp[10];
for(int n=0; n<row; ++n)
{
for(int m=n+1; m<row; ++m)
{
// 冒泡排序
if ( strcmp(p[m], p[n] ) < 0 )
{
strcpy(temp, p[n]);
strcpy(p[n], p[m]);
strcpy(p[m], temp);
}
}
}
for(int n=0; n<row; ++n)
{
printf("%s
", p[n]);
}
}
// 调用
char p[5][10] = {"hello","world","111","135","134"};
WordSort(p, 5);
4> 行指针(二维数组作为形参的参数传递)
void print_1(int (*a)[3], int rowSize)
{
for(int i=0; i<3*rowSize; ++i) // 这里3乘以rowSize,3代表每一行拥有的元素个数。
{
printf("%d ", (*a)[i]);
if ( i%3 == 2)
printf(" ");
}
}
// 调用
print_1(a, 3);
// 打印数组内字符串
void print_string(char (*ptr)[20], int rowSize )
{
for(int i=0; i<rowSize; ++i)
{
printf("%s ", ptr+i); // 这样写会有warning信息.
// warning: format '%s' expects argument of type 'char*', but argument 2 has type 'char (*)[10]'
}
}
// 调用
print_string(a, 6); // 其中a[6][20];
5> 动态分配二维数组行列大小
int m = 2; // 2行
int n = 3; // 3列
int **array = new int*[m]; // 分配行指针数组
for(int i=0; i<m; ++i)
{
array[i] = new int[n]; // 为每一行分配空间
}
// 赋值
array[i][j] = xxx;
// 释放
for(int i=0; i<m; ++i)
{
delete []array[i]; // 删除每一行分配的空间
}
delete []array; // 删除行指针数组
// 分配不等长的二维数组
int m = 3; // 行
int n[3] = {1,2,3}; // 每列的元素个数
int **array = new int*[m]; // 行指针数组
for(int i=0; i<m; ++i)
{
array[i] = new int[ n[i] ]; // 每行分配不一样多的空间
}
// 赋值
for(int i=0; i<m; ++i)
for(int j=0; j<n[i]; ++j)
array[i][j] = xxx;
// 释放
for(int i=0; i<m; ++i)
delete []array[i];
delete []array;
二、 指针数组
1> 区别
char *pc = new char(10); // 开辟一个字符空间,并初始化为10
// 相当于 char * pc = new char; *pc = 10;
// 释放
delete pc;
char *pca = new char[10]; // 开辟一个数组,可保存10个char元素
delete []pca;
2> 指针数组 与 数组指针 如何 指向 二维数组
int m[2][3] = { {1,0,0}, {0,1,0} };
int (*p)[3]; // 数组指针。 即行指针
int *q[3]; // 指针数组. 数组元素是指针,一共可存放3个int指针.
// 行指针(数组指针)
p = m; // p是行指针,可以直接指向二维数组.
// 输出
for(int i=0; i<2; ++i, ++p)
{
printf("%d ", **p); // 每一行第一个元素
printf("%d ", *(*p+1) ); // 每一行第二个元素
printf("%d ", *(*p+2) ); // 每一行第三个元素
printf(" ");
}
// 指针数组
int *q[3];
for(int i=0; i<2; ++i)
q[i] = a[i]; // q是数组, q[i] 是指针。
// 输出
for(int i=0; i<2; ++i)
{
for(int j=0; j<3; ++j)
{
printf("%d ", q[i][j]); // 或者下面输出
//printf("%d ", *(q[i] + j) );
}
printf(" ");
}