您的位置:首页 > 编程语言 > C语言/C++

学习笔记---多维数组及多级指针的使用

2017-01-22 23:28 218 查看
多维数组使用

多维数组做函数参数

代码示例1:

#include <stdio.h>
#include <stdlib.h>
/*这个程序用于测试多维数组作为函数参数*/
int max_value(int array[][4]);//A处
int main()
{
int a[3][4]={{11,32,45,67},{22,44,66,88},{15,72,43,37}};
printf("max value is %d\n",max_value(a));
return 0;
}
int max_value(int array[][4])
{
int i,j,max;
max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]>max)
max=array[i][j];
return max;
}
结果:



解析:
1.调用函数时传递数组名,和一维数组做函数参数基本相同。
2.形式参数的行数可以不确定,但列数必须是确定的!(如:A处可以使用诸如:int array[][4]int array[3][4]形式的定义。而不能使用诸如:int array[][]int
array[3][]
形式的定义)
3.形式参数中数组的列数必须和实际参数中数组的列数相同!(如:int array[][10]作为形参,而将array[2][4]这样的数组作为实参是不行的)

4.以上两条的原理和二维数组定义的规律相同,希望深入了解可以查阅学习笔记---二维数组篇

代码示例2:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试二维数组作为函数参数

实现:
1.有3个学生,每个学生4门课的成绩,计算其总平均分。
2.输出第n个学生的四门课成绩

*/
/*A点*/
void average(int *p,int n);//用于计算并输出平均分
/*B点*/
void search(int (*p)[4],int n);//用于输出第n个学生的成绩
int main()
{
int score[3][4]={{65,67,79,60},{80,87,90,81},{90,99,100,98}};
/*C点*/
average(*score,12);
search(score,2);
return 0;
}
void average(int *p,int n)
{
int *p_end,sum=0,aver;
p_end=p+n-1;
for(;p<p_end;p++)
sum=sum+(*p);
aver=sum/n;
printf("average=%4d\n",aver);
}
void search(int (*p)[4],int n)
{
int i;
printf("No.%d :",n);
for(i=0;i<4;i++)
printf("%4d",*(*(p+n)+i));
printf("\n");
}


结果:



解析:

1.如上代码所示,search函数时标准的使用方式。和一维数组做函数参数没多大区别。(注:这里对数组的操作皆使用指针法。实际上和数组法的原理是相同的)

2.如上代码所示,average函数的操作更加特殊。此处是直接将二维数组转变为一维数组的形式代入函数。并在函数中使用操作一维数组的方式操作二维数组。

3.A点处对形参的定义是:int *p,这是一种一维数组的形式。而B处则对二维数组名取指针运算(此处不可直接传递二维数组的数组名,因为二维数组的数组名实际上是一种 数组指针(int
(*)[]
)不能直接转换成整型指针(int *)),可见是直接把该二维数组中第一个一维数组的地址作为实际参数传入了函数。(
对此处的操作不理解的话可以通过学习笔记---二维数组篇深入了解这种操作方式)

4.在将数组作为参数传入之后,同时将数组的大小作为参数传入。方面操作。

使用多维数组操作字符串(字符串数组)

二维字符数组:

例:char name[5][10]={"Zhao","Qian","Sun","Li","Zhou"};

内存中的情况:



如上图所示,每个字符串长度不同,而分配的空间却是固定的。所以容易造成内存空间的浪费,而且十分的不灵活。

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*这个程序用来测试使用二维字符数组操作成组字符串*/
/*输出最小的姓氏(使用C语言自带的字符串大小判断函数)*/

char *min_name(char [][10],int);
int main()
{
char name[5][10]={"Zhao","Qian","Sun","Li","Zhou"};
printf("%s\n",min_name(name,5));
return 0;
}
char *min_name(char nam[][10],int n)
{
int i;
char *p=nam[0];
for(i=0;i<n;i++)
if(strcmp(p,nam[i])>0)
p=nam[i];
return p;
}
结果:



解析:

和普通二维数组的使用相同,并无特殊。

指针数组:

例:char *name[5]={"Zhao","Qian","Sun","Li","Zhou"};

内存中的情况:



如上图所示,每个字符串长度不同,分配的空间就会不同。能够避免内存空间的浪费,但要注意,和二维字符数组不同的是,这种方式定义的指针数组指向的字符串们的存储空间不一定是顺序存储的!(指针数组中保持的指针的地址是顺序存储的,但这些指针指向的地址却不一定是顺序存储的)

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*这个程序用来测试使用指针数组操作字符串*/
/*对数组中的字符串进行排序并输出(使用C语言自带函数判断字符串大小)*/

void sort(char *name[],int n);//用于排序
void print(char *name[],int n);//用于输出

int main()
{
char *name[]={"Zhao","Qian","Sun","Li","Zhou"};
sort(name,5);
print(name,5);
return 0;
}
void sort(char *name[],int n)
{
char *temp;
int i,j,k;
/*选择排序法*/
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)
k=j;
temp=name[i];
name[i]=name[k];
name[k]=temp;
}
}
void print(char *name[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
}
结果:



解析:因为是指针数组,所以操作数组时用到的一些中间量也务必使用指针类型。

要使用指针数组操作字符串,还需了解二级指针

二级指针

实质:指向指针的指针

解析:指针变量中存储变量的地址,而二级指针变量中存储指针的地址

定义形式:类型名 **变量名;

例如:

int a=100;
int *p=&a;
int **p1=&p;
pirntf("%d",**p1);

注:同理:***p2就是三级指针,****p3就是四级指针。。。。

代码示例:

#include <stdio.h>
#include <stdlib.h>
/*这个程序用来测试二级指针*/
int main()
{
char **p;
char *name[]={"Zhao","Qian","Sun","Li","Zhou"};
for(p=name;p<name+5;p+=1)
printf("%s\n",*p);
return 0;
}
结果:



解析:

1.此处的p就是二级指针,可以看到二级指针在使用指针法操作指针数组时的重要意义。

2.printf输出时,要注意*(取指针运算符)的个数,此处是输出字符串,所以只有一个*,如果输出的是整型等类型,需要两个*。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息