指针

指针与函数

一维函数

  • 在一位数组中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个函数的任意一个

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值