
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
目录

指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。
表示形式
含义
地址
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指向下一元素。
输出二维数组任一行任一列元素的值。
- #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] 型(指向一维数组)的指针变量,反之亦然。