C语言压轴之指针和数组

先思考一下我对C语言中数组和指针比较模糊的概念

  • 数组/指针的输入/输出
  • 数组在子函数中的调用/返回
  • 指针在子函数中的调用/返回
  • 指针数组/数组指针的概念
  • 指针函数/函数指针的概念

好了,接下来就针对知识盲点进行复习

先理解一下指针的概念,这里引用课本

计算机硬件系统中的内存拥有大量的存储单元,为方便管理,故为每个存储党员编地址,每个存储单元有唯一的地址,而指针的作用就是指向对应的地址

指针的输入输出

先上代码

#include<stdio.h>
void main()
{
char *a='a';
char *b;
char *e;
int c='c';
char d='d';
b=&c;
e=&d;
printf("%c\n",a);
//printf("%c",*a); //程序卡死
printf("%c\n",*b);
printf("%c\n",b); //输出为?号
printf("%c\n",&c);//输出为?号
printf("%c\n",e);//输出为?号
printf("%c\n",*e);
}

输出结果

a

c

?

?

?

d

what?????

分析:

第4行

char *a='a'; 表示的是a为地址,此地址的值为‘a’,故12中程序卡死就是因为找不到地址为‘a’对应的值

这个问题是符号优先级的问题

至于14-16行输出问好我估计是地址值超出int范围,故输出问好,int在VC++编译器中为4字节,对应就是2^32次方,不对啊,不应该超出范围的

原来是ASCII码表中只有127个字符,因此该地址超出了char型范围,故显示‘?’

指针的赋值问题

#include<stdio.h>
/*错误*/
/*void main()
{
char *a;
scanf("%c",a);
printf("%c",*a);
}*/
/*正确*/
void main()
{
char *a;
int b;
a=&b;
scanf("%c",a);
printf("%c",*a);
}

指针一定要先分配一个地址才能对其进行赋值;

数组指针在子函数中的调用以及返回

先上代码

{
char *a;
char b[10]={'a','b','c','d','e','f','g','h','i','j'};
a=b;//b就是b[10]的首地址,或者使用a=&b[0]
for(int i=0;i<=9;i++)
{
    printf("指针a的第%i个值%c\n",i,*(a++));
}
a=&b[4];//此时a的地址为b[4]所在的地址
for(int i=0;i<=5;i++)
{
    printf("指针a的第%i个值%c\n",i,*(a++));
}
a=b;
chara(a);
}
int chara(char *a)
{
    for(int i=0;i<=9;i++)
{
    printf("子函数中指针a的第%i个值%c\n",i,*(a++));
}
}

 

这里还要注意的是

被调函数不能改变实参指针变量的值但是可以改变实参指针变量所指向的变量的值

指针函数

我发现,指针函数/函数指针在操作系统中用的非常之多,常常让人一脸懵逼,这一次要仔细看看这玩意了

首先,第一步,抄书上概念。。。

先给个代码

#include<stdio.h>
void main()
{
    int c;
    int max(int,int);//这里才是函数声明哦,表明这是一个返回值为int的函数,其对应的就max(int a,int b)哦
    int (*m)(int,int);//定义一个函数指针!!!函数指针!!!函数指针!!!,注意格式
    m=max;//跟数组似的,max就是函数的入口地址,不用加&max
    c=(*m)(10,9);//调用格式
    printf("%d",c);//打印,大功告成
}
max(int a,int b)
{
    int x;
    if(a>b)
        x=a;
    else
        if(a<=b)
        x=a;
    return x;
}

这只是函数指针的格式

至于它的用处,自然是用处大大滴,它可以用于其它函数调用指针函数作为形参;下面看代码

         

#include<stdio.h>
void main()
{
    int c;
    int max(int,int);//声明函数为int
    int min(int,int);
    c=process(1,2,max);//重点,会考,函数指针调用方法
    printf("%d",c);
    c=process(9,10,min);
    printf("%d",c);
}
max(int a,int b)
{
    int x;
    if(a>b)
        x=a;
    else
        if(a<=b)
        x=b;
    return x;
}

min(int a,int b)
{
    int x;
    if(a>b)
        x=b;
    else
        if(a<=b)
        x=a;
    return x;
}
process(int a,int b,int(*m)(int,int))//这是重点,该函数调用函数指针
{
    int re;
    re=(*m)(a,b);
    return re;
}

  大功告成

这个在好多地方都有用,以前没学好c,打代码就意淫如果有这么一种功能就好了,原来是真的有,C语言赛高

好了,下面开始研究指针函数

a few minites later............

 原来指针函数就是。。。。

返回值为指针的函数,早该想到了,hhhhhh,pass(代码都懒得写了)

不过注意,书上说,函数的返回值可以是不同类型的指针

好了,指针的学习就暂且到这里了,以上应该来说是我写给自己的笔记,所以并没有考虑它的通读性,如果对广大博友有帮助,那就最好了,

其实,学好指针最重要的就是理解指针的含义,它就是一个值为地址的变量而已,至于指针数组,函数指针之类的只不过是在这个定义上的千变万化,如果再掌握符号优先级的话,其实这些很容易理解了,接下来就靠代码量来使自己对之更加熟悉了并且能运用自如,加油,再去写一个小项目

 

                                                                                                                                                                                                                                                    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值