多维数组和指针
为什么需要数组
- 为了解决大量同类型数据的存储和使用问题。
- 用数组可以模拟现实世界。
Int a[25]:一维数组,可以当做一个线性结构。
Int a[8][6]:可以当做一个平面,意思是8行6列。有48个元素。
Int a[3][4][5]:可以当做一个三维立体。
Int a[3][4][5][6]:可以当做一个四维空间。
a代表二维数组首元素的地址,现在的首元素不是一个简单的整型元素,而是由4个整型元素所组成的组,因此a代表的是首行(即第0行)的首地址。a+1代表第1行的首地址。
a[0]、a[1]、a[2]既然是一维数组名,而C语言又规定了数组名代表数组首元素地址,因此a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0]。a[1]的值是&a[1][0],a[2]的值是 &a[2][0]。
具体表示形式如下:
二维数组的访问:
/*输出二维数组任一行任一列元素的值
*/#include <stdio.h>void main(void)
{int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};int (* p)[4];int i, j;p = a;scanf("i=%d,j=%d",&i, &j);printf("a[%d][%d] = %d\n", i, j, *(*(p+i)+j));
}
i=2,j=2
a[2][2] = 21在程序中,“int (* p)[4]”表示p是一个指针变量,它指向的是包含4个整型元素的一维数组。 注意*p两侧的括号不能省略。如果写成*p[4],则为指针数组。
*a有4个元素,每个元素都是整型。也就是说,a所指的对象是有4个整型元素的数组。即a所指向一维数组的指针。
void printArray2D(int (*a)[4], int rows)
{int i,j;for(i = 0; i < rows; ++i){for(j = 0; j < 4; ++j){printf("%4d", *(*(a + i) + j));}printf("\n");}
}
用指向数组的指针做函数参数
通过例子介绍:有一个班,3个学生,各学4门课程,计算总平均分数以及第n个学生的成绩。
/*指向数组的指针做函数参数:有一个班,3个学生,各学4门课程,计算总平均分数以及第n个学生的成绩。
*/
#include <stdio.h>
void average(float *, int);
void search(float (*p)[4], int);void main(void)
{float score[3][4] = {{65,67,70,60},{80,87,90,81},{90,99,100,98}};average(*score, 12); //求12个分数的平均分search(score,2);return;
}void average(float *p, int n)
{float sum = 0;for (int i=0;i<n;i++){sum+=*(p+i);}float aver = sum/n;printf("average = %5.2f\n", aver);
}void search(float (*p)[4], int n)
{//p是指向具有4个元素的一位数组指针printf("the score of No. %d are:\n",n);for (int i=0;i<4;i++){printf("%5.2f ",*(*(p+n)+i));}
}
输出结果:
字符串和指针
例子:将字符串a复制为字符串b
#include <stdio.h>void main(void)
{char a[]="I am a boy.";char b[20];int i;for (i=0;*(a+i)!='\0';i++){*(b+i) = *(a+i);}*(b+i)='\0';//把最后的结束符复制过去;printf("string a is:%s\n",a);printf("string b is:");for (i=0;*(b+i)!='\0';i++){printf("%c",*(b+i));}printf("\n");return;
}
#include <stdio.h>void main(void)
{char a[]="I am a boy.",b[20];int i;char *p1=a;char *p2=b;for(;*p1!='\0';p1++,p2++){*p2 = *p1;}*p2='\0';printf("string a is:%s\n",a);printf("string b is:");for (i=0;b[i]!='\0';i++){printf("%c",b[i]);}printf("\n");return;
}
例题:写一个函数,实现两个字符串的比较,即自己写一个strcmp函数,函数原型为:
int strcmp(char *p1, char *p2)
a