学习笔记---多维数组及多级指针的使用
2017-01-22 23:28
218 查看
多维数组使用
多维数组做函数参数
代码示例1:
解析:
1.调用函数时传递数组名,和一维数组做函数参数基本相同。
2.形式参数的行数可以不确定,但列数必须是确定的!(如:A处可以使用诸如:int array[][4]、int array[3][4]形式的定义。而不能使用诸如:int array[][]、int
array[3][]形式的定义)
3.形式参数中数组的列数必须和实际参数中数组的列数相同!(如:int array[][10]作为形参,而将array[2][4]这样的数组作为实参是不行的)
4.以上两条的原理和二维数组定义的规律相同,希望深入了解可以查阅学习笔记---二维数组篇
代码示例2:
结果:
解析:
1.如上代码所示,search函数时标准的使用方式。和一维数组做函数参数没多大区别。(注:这里对数组的操作皆使用指针法。实际上和数组法的原理是相同的)
2.如上代码所示,average函数的操作更加特殊。此处是直接将二维数组转变为一维数组的形式代入函数。并在函数中使用操作一维数组的方式操作二维数组。
3.A点处对形参的定义是:int *p,这是一种一维数组的形式。而B处则对二维数组名取指针运算(此处不可直接传递二维数组的数组名,因为二维数组的数组名实际上是一种 数组指针(int
(*)[])不能直接转换成整型指针(int *)),可见是直接把该二维数组中第一个一维数组的地址作为实际参数传入了函数。(
对此处的操作不理解的话可以通过学习笔记---二维数组篇深入了解这种操作方式)
4.在将数组作为参数传入之后,同时将数组的大小作为参数传入。方面操作。
使用多维数组操作字符串(字符串数组)
二维字符数组:
例:char name[5][10]={"Zhao","Qian","Sun","Li","Zhou"};
内存中的情况:
如上图所示,每个字符串长度不同,而分配的空间却是固定的。所以容易造成内存空间的浪费,而且十分的不灵活。
代码示例:
解析:
和普通二维数组的使用相同,并无特殊。
指针数组:
例:char *name[5]={"Zhao","Qian","Sun","Li","Zhou"};
内存中的情况:
如上图所示,每个字符串长度不同,分配的空间就会不同。能够避免内存空间的浪费,但要注意,和二维字符数组不同的是,这种方式定义的指针数组指向的字符串们的存储空间不一定是顺序存储的!(指针数组中保持的指针的地址是顺序存储的,但这些指针指向的地址却不一定是顺序存储的)
代码示例:
解析:因为是指针数组,所以操作数组时用到的一些中间量也务必使用指针类型。
要使用指针数组操作字符串,还需了解二级指针
二级指针
实质:指向指针的指针
解析:指针变量中存储变量的地址,而二级指针变量中存储指针的地址
定义形式:类型名 **变量名;
例如:
注:同理:***p2就是三级指针,****p3就是四级指针。。。。
代码示例:
解析:
1.此处的p就是二级指针,可以看到二级指针在使用指针法操作指针数组时的重要意义。
2.printf输出时,要注意*(取指针运算符)的个数,此处是输出字符串,所以只有一个*,如果输出的是整型等类型,需要两个*。
多维数组做函数参数
代码示例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输出时,要注意*(取指针运算符)的个数,此处是输出字符串,所以只有一个*,如果输出的是整型等类型,需要两个*。
相关文章推荐
- C语言学习笔记(19) 多维数组和多维指针分析
- C语言学习笔记21——多维数组和多维指针
- 黑马程序员----C 语言学习笔记之结构体数组,指针,嵌套的使用
- PHP学习笔记——使用数组的内部指针控制函数遍历数组
- C++学习笔记--指针和多维数组
- C++学习笔记六之函数如何使用指针来处理数组?
- 【C++Primer学习笔记】第4章 数组和指针
- 【C Prime Plus】学习笔记,Chapter 10,数组和指针之四
- C++ Primer 学习笔记:数组和指针
- c数组与指针学习笔记
- 【C Prime Plus】学习笔记,Chapter 10,数组和指针之一
- C++ Primer 学习笔记——第4章 数组和指针
- C复习笔记(多维数组与指针)
- 【VC++ 中使用ADO操作数据库学习笔记】_ConnectionPtr指针的基本用法
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- 多维数组,指针数组使用,指向指针的指针
- 智能指针auto_prt的使用(c++学习笔记)
- php学习笔记(7):PHP数组的创建修改使用
- C++学习笔记(四)——数组和指针
- 使用指针来将多维数组传递给函数