C学习笔记-311

多维数组和指针

为什么需要数组

  1. 为了解决大量同类型数据的存储和使用问题。
  2. 用数组可以模拟现实世界。

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

posted @ 2025-03-11 14:31  同州  阅读(17)  评论(0)    收藏  举报