C学习笔记-311
多维数组和指针
为什么需要数组
- 为了解决大量同类型数据的存储和使用问题。
- 用数组可以模拟现实世界。
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
浙公网安备 33010602011771号