学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
学习日记
目录
前言![](https://i-blog.csdnimg.cn/blog_migrate/9b07de30e8ddde457ce73270c93cc5e9.png)
指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。
一、多维数组元素的地址
表示形式
含义
地址
a
二维数组名,指向一维数组a[0],即0行起始地址
2000
a[0], *(a+0), *a
0行0列元素地址
2000
a+1, &a[1]
指向第1行起始地址
2016
a[1], *(a+1)
1行0列元素a[1][0]的地址
2016
a[1]+2, *(a+1)+2, &a[1][2]
1行2列元素a[1][2]的地址
2024
*(a[1]+2), *(*(a+1)+2), a[1][2]
1行2列元素a[1][2]的值
是元素值,为13
C语言的地址信息中既包含位置信息(如内存编号2000),还包含它所指向的数据的类型信息。 a[0]是一维数组名,它是一维数组中起始元素的地址,a是二维数组名,它是二维数组的首行起始地址,二者的纯地址是相同的,即2000,但它们的基类型不同,即它们指向的数据的类型不同,前者是整型数据,后者是一维数组。
int (*pt)[4];
//表示pt指向由4个整型元素组成的一维数组,此时指针变量pt的基类型是由4个整型元素组成的一维数组
例
输出二维数组的有关数据(地址和元素的值)。
#include <stdio.h>
int main()
{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
printf("%d,%d\n",a,*a); //0行起始地址和0行0列元素地址
printf("%d,%d\n",a[0],*(a+0)); //0行0列元素地址
printf("%d,%d\n",&a[0],&a[0][0]); //0行起始地址和0行0列元素地址
printf("%d,%d\n",a[1],a+1); //1行0列元素地址和1行起始地址
printf("%d,%d\n",&a[1][0],*(a+1)+0); //1行0列元素地址
printf("%d,%d\n",a[2],*(a+2)); //2行0列元素地址
printf("%d,%d\n",&a[2],a+2); //2行起始地址
printf("%d,%d\n",a[1][0],*(*(a+1)+0)); //1行0列元素的值
printf("%d,%d\n",*a[2],*(*(a+2)+0)); //2行0列元素的值
return 0;
}
二、指向数组元素的指针变量
有一个3×4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。
#include <stdio.h>
int main()
{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p; //p是int *型指针变量
for(p=a[0];p<a[0]+12;p++) //使p依次指向下一个元素
{ if((p-a[0])%4==0) printf("\n"); //p移动4次后换行
printf("%4d",*p); //输出p指向的元素的值
}
printf("\n");
return 0;
}
p是一个int *型(指向整型数据)的指针变量,它可以指向一般的整型变量,也可以指向整型的数组元素。每次使p值加1,使p指向下一元素。
三、指向由m个元素组成的一维数组的指针变量
输出二维数组任一行任一列元素的值。
#include <stdio.h>
int main()
{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; //定义二维数组a并初始化
int (*p)[4],i,j; //指针变量p指向包含4个整型元素的一维数组
p=a; //p指向二维数组的0行
printf("please enter row and colum:");
scanf("%d,%d",&i,&j); //输入要求输出的元素的行列号
printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j)); //输出a[i][j]的值
return 0;
}
int a[4];
(a有4个元素,每个元素都为整型)
注意指针变量的类型
四、用指向数组的指针作函数参数
一维数组名可以作为函数参数,多维数组名也可作函数参数。 用指针变量作形参,以接受实参数组名传递来的地址。可以有两种方法:
① 用指向变量的指针变量。
② 用指向一维数组的指针变量。
例
有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。
#include <stdio.h>
int main()
{ void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
average(*score,12); //求12个分数的平均分
search(score,2); //求序号为2的学生的成绩
return 0;
}
void average(float *p,int n) //定义求平均成绩的函数
{ float *p_end;
float sum=0,aver;
p_end=p+n-1;
//n的值为12时,p_end的值是p+11,指向最后一个元素
for(;p<=p_end;p++)
sum=sum+(*p);
aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float (*p)[4],int n)
//p是指向具有4个元素的一维数组的指针
{ int i;
printf("The score of No.%d are:\n",n);
for(i=0;i<4;i++)
printf("%5.2f ",*(*(p+n)+i));
printf("\n");
}
实参与形参如果是指针类型,应当注意它们的基类型必须一致。不应把int *型的指针(即数组元素的地址)传给int (*)[4] 型(指向一维数组)的指针变量,反之亦然。