指针与函数
一维函数
- 在一位数组中void fun(int arr[] ,int n) 与 void(int *p ,int t)是一样的定义
两者都能对实参进行重新改变所对应的值。前一个是利用数组的原地址,实参与形参利用共同的内存单元,不另外开辟新空间;后一个是利用地址指向的值进行对实参的改变
二维函数
在二维数组中指针的表现形式
表示的形式 | 代表的含义 |
---|---|
a | 第0行的起始地址 |
a[0] ,a ,(a+0) | 0行0列的起始地址 |
a+1 ,&a[1] | 1行的起始地址 |
a[1] ,*(a+1) | 1行0列的起始地址 |
a[1] + 2 ,*(a + 1) + 2 ,&a[1][2] | 1行2列的起始地址 |
星号(a[1] + 2) ,星号(*(a + 1)+ 2),a[1][2] | 1行2列的元素值 |
上机操作
#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);
printf("%d,%d\n",a[0],*(a+0));
printf("%d,%d\n",&a[0],&a[0][0]);
printf("%d,%d\n",a[1],a+1);
printf("%d,%d\n",&a[1][0],*(a+1)+0);
printf("%d,%d\n",a[2],*(a+2));
printf("%d,%d\n",&a[2],a+2);
printf("%d,%d\n",a[1][2],*(*(a+1)+2));
printf("%d,%d\n",*a[2],*(*(a+2)+0));
return 0;
}
实验结果
在二维数组中*(a+x)代表的是某行的地址。
指针字符串
用指针定义字符串
1.char *string = “I love China”;
2.char *a = “I love China”;
等价于
1.char *string;
string = “I love China”;
2.char *a;
a = “I love China”;
不能这样定义
1.char str[14];
str[0] = ‘I’;
str = “I love China”;
2.char str[14];
str[] = “I love China”;
具体应用:
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int main()
{
char str_1[MAX],str_2[MAX],*p_1,*p_2;
char value;
char strcmp(char *a,char *b);
printf("请输入第一个字符串:");
gets(str_1);
printf("请输入第二个字符串:");
gets(str_2);
p_1 = str_1;
p_2 = str_2;
value = strcmp(p_1,p_2);
printf("%d",value);
}
char strcmp(char *a,char *b)
{
char i = 0;
for(; i < MAX, *(a+i) != '\0',*(b+i) != '\0'; i++)
{
if(*(a + i) == *(b + i))
continue;
else
return (*(a + i) - *(b + i));
}
return 0;
}
用指针实现“strcmp”的功能
指向函数的指针
形式
类型名(* 指针变量名)(函数参数列表)
(*指针变量名)就是函数的名字,一定要用括号括起来
重要用途就是把函数的入口地址作为参数传递到其他函数
具体应用
#include<stdio.h>
int main()
{
int fun(int x,int y,int (*p)(int ,int ));
int max(int,int);
int min(int,int);
int add(int,int);
int a = 55,b = 85,n;
printf("请选择1,2,3:");
scanf("%d",&n);
if (n == 1)
fun(a,b,max);
else if (n == 2)
fun(a,b,min);
else if (n == 3)
fun(a,b,add);
return 0;
}
int fun(int x,int y,int (*p)(int ,int ))
{
int result;
result = (*p)(x,y);
printf("%d\n",result);
}
int max(int x,int y)
{
int z;
if(x > y)
z = x;
else
z = y;
printf("max = ");
return(z);
}
int min(int x,int y)
{
int z;
if(x < y)
z = x;
else
z = y;
printf("min = ");
return(z);
}
int add(int x,int y)
{
int z;
z = x + y;
printf("sum = ");
return(z);
}
通过选择可以调用3个函数的任意一个