C语言基础(三)指针

一、指针概念

  • 指针也就是内存地址,指针变量是用来存放内存地址的变量

在这里插入图片描述

  • 使用指针存储其他变量地址之前,必须对其进行声明
  • 指针变量声明的一般形式为:type *var-name;
  • 指针的访问
#include <stdio.h>
int main()
{
    int num = 10;
    int *p;
    p = &num;
    printf("%d\n",p);
    printf("%d\n",*p);
    return 0;
}
  • 通过指针引用数组
#include <stdio.h>

//通过指针引用数组
int main()
{
    int num[5] = {1,2,3,4,5};
    int i;
    int *p;
    p = num;   //数组名就是指针的首地址
    printf("%d\n",*p);
    for(i=0;i<5;i++)
    {
        //printf("address:%d",p++);
        //printf("value:%d\n",*(p++));
        //printf("value:%d\n",*(p+i));
        printf("value:%d\n",*p+i);
    }

    return 0;
}
  • 指针类型:
int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */
void *p/*万能指针*/

二、指针数组

1.定义:

type *var-name[n];
char *p[20];

2.指针数组的访问

#include <stdio.h>
int main()
{
    int num[5] = {1,2,3,4,5};
    int i;
    int *p[5];
    for(i=0;i<5;i++)
    {
        p[i] = &num[i];
        printf("addr:%p value:%d\n",p[i],*p[i]);
    }
    return 0;
}

3.指针数组的类型

int    *ip[2];    /* 一个整型的指针数组 */
double *dp[3];    /* 一个 double 型的指针数组 */
float  *fp[5];    /* 一个浮点型的指针数组 */
char   *ch[2];    /* 一个字符型的指针数组 */
void *p[20]/*万能指针数组*/

三、指针函数

当函数需要返回一个数组咋办

使用指针作为返回值
(指针函数)
函数原型
int *fun(void)
{

}

使用
Int *p;
p = fun();

示例:

#include <stdio.h>
#include <string.h>
//当返回是个数组时,只能用指针做返回值
//输入俩个字符串,返回较大的字符串
//指针函数
char *str_long(char *s1,char *s2)
{
    if(strlen(s1) > strlen(s2))
    {
        return s1;
    }
    else{
        return s2;
    }
}

int main()
{
    // char str1[30] = {"qwe"};
    // char str2[30] = {"asddf"};
    // char *p;
    // p = str_long(str1,str2);

    char str1[30],str2[30],*p;
    gets(str1);
    gets(str2);
    p = str_long(str1,str2);
    printf("Longer str:%s\n",p); //%s会根据p[0] 地址自动遍历获取对应的值
    return 0
}

另一种实现方法

//比较俩个字符串谁大,并返回最大的字符串 
//实现方法:指针函数

char *strlong(char *s1,char *s2)
{
    if(strlen(s1)>strlen(s2))
    {
        return s1;
    }
    else{
        return s2;
    } 
}

void strlong_test()
{
    char str1[30];
    char str2[30];
    char *p;
    gets(str1);
    gets(str2);
    int len1,len2;
    len1 = strlen(str1);
    len2 = strlen(str2);
    p = strlong(str1,str2);
    printf("str long is ");
    if(len1>len2)
    {
        for(int i=0;i<len1;i++)
        {
            printf("%c",*p++);
        }
    }
    else{
        for(int i=0;i<len2;i++)
        {
            printf("%c",*p++);
        }
    }
}
int main()
{
	strlong_test();
	return 0;
}

四、函数指针

指向函数的指针(函数指针)
函数返回值类型 (* 指针变量名) (函数参数列表);
参数列表中只需要写函数的参数类型即可

int Func(int x);   /*声明一个函数*/
int (*p) (int);  /*定义一个函数指针*/
p = Func;          /*将Func函数的首地址赋给指针变量p*/

示例代码:

#include <stdio.h>
//指向函数的指针,(函数指针)
int max(int x,int y)
{
    return x>y?x:y;
}

int main()
{
    //定义一个函数指针
    int(*p)(int ,int );
    int a,b,c;
    p = max; //把函数max赋给指针变量p, 使p指向max函数
    printf("please enter a and b:");
    scanf("%d %d",&a,&b);
    c = p(a,b);
    printf("a = %d\nb = %d\nmax = %d\n", a, b, c);
    return 0;
}

五、函数指针数组

指向函数的指针

函数指针数组定义

int (*fun[10])(int,int);

使用

int my_add(int x, int y)
{return (x+y);}
int my_dec(int x, int y)
{return (x-y);}

fun[0] = my_add;
fun[1] = my_dec;

(*fun[0])(1,  2);
(*fun[1])(10,  2);

示例代码:

#include<stdio.h>
#include<stdlib.h>
//函数指针数组

int add(int a, int b){	return a + b;}
int sub(int a, int b){	return a - b;}
int mul(int a, int b){	return a * b;}
int div(int a, int b){	if (b != 0)	return a / b; }
int test(int a,int b,int(*fn)(int,int))      
{
    return fn(a,b);
}

void test_test()
{
    int i=0;
    int (*p[])(int a,int b) = {add,sub,mul,div} ; //定义一个函数指针数组
    int n = sizeof(p) / sizeof(p[0]);	
    for(i=0;i<n;i++)
    {
        printf("%d\n",p[i](4,5));
    }
    printf("%d",test(4, 5, add));//函数指针作为函数的参数 	
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值