精华内容
下载资源
问答
  • 再将函数赋给函数指针。但是我按照这个方式做了之后,发现报错了。请问各位这是什么 原因? ![我写的代码](https://img-ask.csdn.net/upload/201710/03/1507020709_237009.png) ![书上的代码]...
  • 函数指针和指针函数

    2021-05-07 09:36:51
    函数指针和指针函数的区别 ...2.如何给函数指针赋值: void data(int a,int b){ } int main(){ void(*p2)(int a,int b);//声明一个函数指针 int a = 10,b = 20; p2=data;//初始化函数指针(给函数指针赋值)

    函数指针和指针函数的区别


    一、函数指针

    本质上是一个指针,它指向的是一个函数的地址。

    1.如何定义一个函数指针:

    void(*p2)(int a,int b);
    

    函数指针是专用的。格式要求很强 返回值,参数类型,个数都必须相同。

    2.如何给函数指针赋值:

    void data(int a,int b){
    	
    }
    int main(){
    		void(*p2)(int a,int b);//声明一个函数指针
    		int a = 10,b = 20;
    		p2=data;//初始化函数指针(给函数指针赋值)
    		p2(a,b);
    		return 0;
    }
    

    我们都知道数组名就代表这个数组的首地址,函数名也一样,函数名就代表这个函数的地址,所以用p2这个指针指向data这个函数。

    3.如何调用函数指针:

    1. 直接通过指针名字+需要传递的参数,如: p2(a,b);

    2. 取内容+需要传递的参数,如:(*p2)(a,b);

    推荐使用第一种方法

    二、指针函数

    本质上是一个函数,他的返回值是一个指针

    int *add(int a,int b)
    {
    	int ret;
        ret = a+b;
    	return &ret;
    }
    int main()
    {
    		int a = 10;
    		int b = 20;
    		int *p = add(a,b);//因为add的返回值是一个指针,所以要用相同类型的指针接收返回值
    		printf("p = %d\n", *p);
    		return 0;
    }
    
    展开全文
  • 函数指针

    2020-09-26 14:36:47
    -----含义: 函数指针是指向函数的指针变量。...2.如何给函数指针赋值: p = printwelcome;//函数名就是地址 3.如何通过函数指针调用函数: p( ) //直接通过指针名字加() 或(*p)() //取内容 (*指针名字)+() #

    -----含义:

    函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

    1.如何定义一个函数指针:

    void (*p)( )

    • *1.如何表示指针:星号*
      2.如何表示函数    ( )
      

    2.如何给函数指针赋值:

    p = printwelcome;//函数名就是地址

    3.如何通过函数指针调用函数:

    p( ) //直接通过指针名字加()
    或(*p)() //取内容 (*指针名字)+()



    举例

    #include <stdio.h>
    
    int add(int a,int b)
    {
          return a+b;
    }
    
    int main()
    {
           int *padd(int a,int b);  //定义函数指针
           padd = add;              //赋值
           int ret = padd(1,2);     //调用函数
           
           printf("ret = %d\n",ret);
           
           return 0;
    }
    
    展开全文
  • 我们都知道,指针是指向一段内存空间的。而这个内存空间也可以存放下一个内存空间...你在main函数里面声明了一个字符串指针,然后你想通过调用一个外部函数来修改它。这个时候,你就可以将这个字符串指针的地址传递

    我们都知道,指针是指向一段内存空间的。而这个内存空间也可以存放下一个内存空间的地址,这样一级级的传递下去,就变成了多级指针。在C语言中,多级指针是经常会用到的。

    多级指针像一把双刃剑,有利也有弊。你能够用它完成一些奇淫技巧,也会遇到一些不可捉摸的错误。

    其中,指针有一个非常重要的作用:间接赋值。

    你能够通过n级指针去修改n-1级指针的内容,甚至直接修改指针所指向的内存空间

    例如:

    你在main函数里面声明了一个字符串指针,然后你想通过调用一个外部函数来修改它。这个时候,你就可以将这个字符串指针的地址传递给函数。这样,函数的参数就是一个二级指针了,通过这个二级指针,你可以很方便的修改字符串的内容。

    代码如下:

    #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>intTest1(char**p1){chartemp=(char)malloc(50);strcpy(temp,“hey!”);//间接赋值*
    p1=temp;//更改指针所指向的内存空间
    printf(“T1 %d\n”,p1);//打印出地址}
    intTest2(char
    p2){strcpy(p2,“goodBy!”);printf(“T2 %d\n”,p2);//打印出地址 ,会发现和实参的地址一样}//间接赋值//利用n级指针 改变n-1级指针的值
    intmain(int argc,charargv[]){charp=(char*)malloc(100);printf("%d\n",p);strcpy(p,“hello”);Test1(&p);//通过n+1级指针直接更改指向的内存空间printf("T1 修改后的值 %s\n ",p);Test2§;//通过同级指针更改内容printf("T2 修改后的值 %s\n ",p);system(“pause”);return0;}

    上述代码中有两个函数,其中Test1直接通过n+1级指针修改了p所指向的内存空间,而Test2只是修改了p所指向内存空间的内容。它们都能够修改p的内容,但是相对于test2而言,test1更为彻底。当然,具体选用那种方式,还是要根据实际的项目需求来定。

    指针

    http://www.makeru.com.cn/live/1392_238.html?s=45051

    指针换装你还认识吗

    http://www.makeru.com.cn/live/5413_2043.html?s=45051

    C语言控制led灯

    http://www.makeru.com.cn/live/1392_304.html?s=45051

    如何编写生活中的C语言

    http://www.makeru.com.cn/live/5413_2649.html?s=45051

    展开全文
  • 指针如何赋值?关于指针的理解

    千次阅读 2019-10-12 23:17:46
    今天班上的一个学霸在学习数据结构的字符串的时候遇到了一个问题,这个问题就是他在写代码的时候,不管怎么样Main方法里就是不能够给指针赋值,就算赋值了好像指针里啥都没有,更别说使用其他函数了。 首先声明一下...
    数据结构文章推荐:
    👉 顺序表和链表实现图书管理系统
    👉 多种方式实现英文单词词频统计和检索系统
    👉 深度优先搜索判断有向图路径是否存在
    👉 待更新

    ——关于指针的一个问题

           今天班上的一位学霸在学习数据结构的字符串的时候遇到了一个问题,这个问题就是他在写代码的时候,不管怎么样主函数里就是不能够给指针赋值,就算赋值了好像指针里啥都没有,更别说使用其他函数了。
           首先声明一下:这个问题其实并不难,个人认为这个问题只要简单的认识两个点——指针到底是什么?指针到底怎么用?就可以搞懂这个问题了!接下来我会用我认为最简单的思路为有疑惑的同学一步步的讲解,希望各位有耐心的看完,谢谢!!!
           话不多说,我模拟了一下当时重要部分的代码,具体如下:

    void output(char *chars){
        int i = 0;
        while(chars[i]!='\0'){
            printf("%c",chars[i]);
            i++;
        }
    }
    int main(){
        //char chars[] = "abcdefg";
        char *chars;
        int i = 0;
        while(scanf("%c",&chars[i++])!='\0'){}
        output(chars);
        return 0;
    }
    

    代码分析

           1、从上述代码可以看出,output中的一个参数是char的指针,output这个函数目的就是简单的输出一下指针里的东西。
           2、主函数中定义了一个名字为chars的字符串指针,并且主函数中试图利用循环对指针进行赋值
           3、主函数对名为chars的指针赋值完毕之后,最后调用output函数将指针的值输出。
           没错,你没有看错,就是这么简单的代码!好了,最上述代码的具体功能分析已经结束。


    问题分析 & 问题解决

           我们再看一下问题:主函数不能给chars这个指针赋值,在运行的时候就是输入一串字符之后就中止进程了,就像这样?:
    问题的错误情况
           那么这种问题为什么会出现?其实仔细看代码,其他地方实际上都没有写错,就是这个chars怎么看都不顺眼(实际上当时不是while循环是for循环,当时for循环也有一点小问题,所以这里写成了while)
           当时是指针的错误,但是我没有急着说,我在想什么同学会这样写——主函数中有一个chars的指针,output函数中的参数也为chars指针。没错,许多人都有个习惯,那就是认为主函数中要调用自定义函数,那么传过去东西的也必须是和自定义函数一样的(都是指针)!这是我的同学犯错的原因之一。
           不急着矫正错误,如果顺着其思路走下去,其实想法是没错的。因为在学数据结构的时候有个顺序表,顺序表中有个内容是这样的?:

    第一部分
    //顺序表数据结构
    typedef struct SqList{
        Book *elem;   //储存空间的基地址
        int length;   //数据结构的长度
    };
    
    第二部分:
    //初始化顺序表基本算法
    Status InitList(SqList &BookSystem){
        //构造一个空的顺序表BookSystem
        BookSystem.elem =  new Book[maxsize];   //分配内存空间
        if(!BookSystem.elem)exit(-1);   //存储分配失败
        BookSystem.length = 0;  //当前长度为0
        return OK;
    }
    
    第三部分:
    //添加6本图书
    void insertBook(SqList &BookSystem){
        int i = 0;  //循环变量
        for(i;i<6;i++){
        	int index = i;
            Book newBook;
            scanf("%s %s %s %s %s %f",&newBook.isbn,&newBook.authorName,
                      &newBook.bookName,&newBook.publisher,
                      &newBook.publishYear,&newBook.price);
            BookSystem.elem[index] = newBook;
        }
    }
    

           当时他说有个地方搞不清,就是结构体中的elem也是个指针,在insertBook函数中也可以用下标形式给指针赋值,所以就按照这个思路写了他的代码。
           乍一看好像也对,但仔细看看就不对了,我相信我的同学没有仔细揣摩为什么要有第二部分,而是直接照着第一部分第三部分写了代码。没有理解到初始化指针的作用,这也是我的同学犯错的原因之二。


    问题解决之指针到底是什么?指针的作用方式?

           知道了错误之后,就要纠正错误,纠正错误就从两点搞起:1、指针到底是个啥?2、指针到底咋个用?——接下来就以我自己的想法和大家说一说,也许就能解决大家的疑惑了!
           首先,指针是个啥?我们都知道指针这东西很重要,这东西就想骇客手里的工具一样,“指”到你的设备,就能入侵你的设备并且还能扒取并修改你设备里的信息,但如果不去“指”,这个工具就缺少了入侵别人设备的途径,也就不能对别人的设备为所欲为了。
           上面已经说了指针必须得指到一个东西才能改那个东西。那么看上面代码可以知道,光定义了一个指针,但是没把任何东西的地址给那个指针,那还怎么能给那个指针赋值呢?这就是犯错的第二个原因,没有初始化指针!
           这里继续强调一下第二个代码示例中的第二部分,第二部分中将Book数组的首元素地址给了elem指针,所以才能执行第三部分的添加图书的操作的?

    BookSystem.elem =  new Book[maxsize];   //分配内存空间
    

           好了,到了这里肯定有人会认为:给主函数里的那个指针一个被指的东西不就好了?就像这样?:

    int main(){
    	char shuzu[] = "abcdefg";
        char *chars = shuzu;
        int i = 0;
        while(scanf("%c",&chars[i++])!='\0'){}
        output(chars);
        return 0;
    }
    

           确实,给一个字符数组让指针去指,就可以通过指针给数组赋值了。但还是有一个问题——主函数中调用output函数时传的是指针吗?显而易见,肯定不是,与上面所说的一样,指针通过指向某个值之后再去获取或修改那个值。再看下面的代码?:

    void output(char *chars){
        //输出数组内容...
    }
    int main(){
    	//代码略...
        output(chars);
        return 0;
    }
    

           主函数传了个指针chars给output函数,output函数接收到chars之后,chars指向了chars然后执行输出操作,两者都是指针。听着是不是很乱?还记得我说的犯错的原因之一是什么吗?就是取了相同的名字所以容易让人混淆!
           我们将主函数中的chars改个名?:

    void output(char *chars){
        //输出数组内容...
    }
    int main(){
    	char shuzu[] = "abcdefg";
        char *c = shuzu;
        int i = 0;
        while(scanf("%c",&c[i++])!='\0'){}
        output(c);
        return 0;
    }
    

           output函数接收到c之后,chars指向了c,如果说chars要取数组的内容那么是这样的:指针chars去找指针c中所指的数组的元素。不管怎么样,这样也太麻烦了。我们直接传数组过去让chars指不就好了吗?这样的话主函数就不用再写什么指针,老老实实写个数组再传就OK了!

    int main(){
    	char shuzu[] = "abcdefg";
        scanf("%s",&shuzu);
        output(shuzu);
        return 0;
    }
    

           OK,问题解决!

    问题总结

           我当时看到这个问题的时候,第一眼看过去好像还真是那么回事,从上述的代码分析也可以看出,其实这些代码要干什么我们都懂,但我的那位同学就是遇到了这个‘简单’的问题。
           为什么说这个问题是个‘简单’的问题?还是文章开头所说:这个问题其实并不难,个人认为这个问题只要简单的认识指针到底是什么?指针到底怎么用?就可以搞懂这个问题了!
           本人水平有限,我认为写一些能给大家帮助的文章非常有必要,同时巩固自己的思想,我认为逻辑思考能力十分重要,希望一些平时有很多疑惑的朋友务必要有思考的精神!
           最后,如果大家觉得本文有帮助,记得支持一下哦!大二菜鸟欢迎交流!

    展开全文
  • 我们先来看一下函数指针如何定义的,假如我们有一个函数int fun(int){…};那么他对应的函数指针写法就应该是int (*p)(int);然后再对他进行赋值,即p=fun;之后你就可以在接下来的地方按p作为函数名来调用它用起来...
  • C++如何定义一个函数指针

    千次阅读 2019-06-13 11:08:19
    一、定义一个函数指针 int (*fun)(int a); // 赋值 fun = function; // 使用 fun(2); 二、定义一个函数指针类型 typedef int (*function_p)(int a); //定义一个实体函数指针 funcyion_p fun; /...
  • C语言 函数指针

    2021-03-26 15:52:43
    如何给函数赋值 void (*p2)(); p2 = printWelcome;//函数就是地址,就像数组一样,数组名就是地址 如何通过函数指针调用函数 p2(); //直接通过指针名字+() (*p2)() ; //取内容 (**指针名字)() 例子: #include &...
  • 我们都知道,指针是指向一段内存空间的。而这个内存空间也可以存放下一个内存空间...你在main函数里面声明了一个字符串指针,然后你想通过调用一个外部函数来修改它。这个时候,你就可以将这个字符串指针的地址传递
  • 但是在构造函数输入赋值时遇到了问题,前后改了多次,最后使用const char*定义才能在构造函数成功赋值,但是用成员函数就没法直接赋值了,比较晕,请大佬详细分析一下在类中定义的字符指针(如 char* 如何正确使用...
  • 如何理解这句话,首先,从“如果需要析构函数”这里我们知道,类中必然出现了指针类型的成员(否则不需要我们写析构函数,默认的析构函数就可以用了),所以,我们需要自己写析构函数来释放给指针所分配的内存来防止...
  • 当一个带有指针成员*b的类A被拷贝或赋值给B时,该指针所指向的内存多出一个指针B.b,这样,当A 对象析构时,删除了A.b所指向的内存,这时,当B析构时,利用delete 释放B.b指向的内存时发现要释放的内存不存在,会...
  • 2.函数指针与指针函数在C语言中,函数是有他的地址,同理,函数有也有他的地址,如果如果我们把函数的地址赋值给函数指针,那么我们就可以间接的通过函数指针调用函数地址了。函数指针的定义如下:数据类型 (*fun)(参...
  • 嵌入式编程中,如何使用复杂指针? ...在C语言中,函数是有他的地址,同理,函数有也有他的地址,如果如果我们把函数的地址赋值给函数指针,那么我们就可以间接的通过函数指针调用函数地址了。 ...
  • 如果在指针为野指针的情况下就进行调用,那么不管在函数如何给其赋值,都无法在函数外使用这个指针。 在函数内给指针赋值时,要使用 指针名=变量名/值 而不是 指针名=&变量名 因为变量会随着函数的使用结束而....
  • “在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》 下面给出几个简单的...
  • 如何避免野指针

    2016-11-13 21:41:37
    何为野指针?野指针就是,没有被初始化的指针,会由系统默认一个随机地址的指针。如果不小心使用的野指针,易...2、当往指针指向的空间赋值时,一定要检查是否有这个指针分配空间。如果没有,就用malloc函数进行分配
  • 在前面也说过函数定义的时候实际上是定义了一个函数变量,那么是否可以将函数变量赋值给其他变量呢?回答这些问题需要涉及另外一个概念:函数指针。按照已有的指针的知识,顾名思义,函数指针就是指向函数指针...
  • 出处:CSDN 作者: myali88“在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 289
精华内容 115
关键字:

如何给函数指针赋值