黑马程序员--C语言之指针二
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
1、多维数组的地址
例如:二维数组a的有关指针
a 表示二维数组名,指向一维数组a[0],即0行的首地址
a[0],*(a+0),*a 表示0行0列元素地址
a=1,&a[1] 表示1行首地址
a[1],*a+1 表示1行0列元素a[1][0]的地址
a[1]+2,*(a+1)+2,&a[1][2] 表示1行2列元素a[1][2]的地址
*(a[1]+2),*(*(a+1)+2) 表示1行2列元素a[1][2]的地址的值
例如:
#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=a;//p指向二维数组的0行
printf("请输入行和列:");
scanf("%d,%d",&i,&j);//输入要求元素的行列数
printf("a[%d,%d]=%d\n"*(*(p+i)+j));//输出a[i][j]的值
return 0;
}
2、通过指针引用字符串
用字符数组存放一个字符串,可以通过数组名和下标引用字符串中的一个字符,也可以通过数组名和格式声明“%s”输出字符串
1)用字符数组名作为函数参数
#include<stdio.h>
int main()
{
void copy_string(char from[],char to[]);
char a[]="wozaixuexicyuyan";
char b[]="wozhunbeiquheimaxuexi";
printf("string a =%s\n,string b=%s\n",a,b);
printf("复制之后的数组:");
copy_string(a,b);
printf("\nstring a =%s\n,string b=%s\n",a,b);
return 0;
}
void copy_string(char from[],char to[])
{
int i=0;
while(from[i]!='\0')
{
to[i]=from[i];
i++;
}
to[i]='\0';
}
字符指针变量和字符数组的比较:
1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址;
2)可以对字符指针变量赋值,但不能对数组名赋值
3)字符数组编译时为其分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元。
4)指针变量的值可以改变,而数组名代表了一个固定的值,即数组元素首元素的地址不能改变。
3、指向函数的指针
定义:如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址就称为这个函数的指针。
定义和使用指向函数的指针变量
类型名(*指针变量名)(函数参数列表)
如int (*p)(int,int);
注意:1)定义指向函数的指针变量并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型函数;
2)如果要用指针调用函数,必须先使指针变量指向该函数;
3)在给函数指针变量赋值时,只需给出函数名而不必给出参数;
4)用函数指针变量调用函数时,只需将(*p)代替函数名即可;
5)对指向函数的指针变量不能进行算术运算;
6)用函数名调用函数,只能调用所指定的一个函数,而通过指针变量调用函数比较灵活,可以先后调用不同的函数。
例如:输入两个数根据选择求其中的大小值
#include <stdio.h>
int main()
{
int max(int,int);
int min(int,int);
int(*p)(int,int);
int a,b,c,n;
printf("请输入两个数:");
scanf("%d,%d",&a,&b);
printf("请选择1或者2\n");
scanf("%d",&n);
if (n==1) {
p=max;
}
else if (n==2){
p=min;
}
c=(*p)(a.b)
if(n==1)printf("max=%d\n",c);
else printf("min=%d\n",c);
return 0;
}
int max(int x,int y){
int z;
if (x>y)z=x;
else z=y;
return z;
}
int min(int x,int y){
int z;
if (x<y) {
z=x;
}else z=y;
return z;
}