展开

关键词

C言中函数指针怎么工作的

问题 C言中的函数指针怎么用的? 回答 我们先定义一个函数以方便接下来的讲解, int addInt(int n, int m) { return n+m; } 再定义一个可以指向函数 addInt 的函数指针, int (*functionPtr )(int, int); 现在我们就可以给这个函数指针赋值了, functionPtr = addInt; // functionPtr = &addInt 也是可以的 函数指针有了指向的内容,就可以这么使用 { int (*functionPtr)(int, int) = addInt; return functionPtr; } 我们还可以使用 typedef 关键字来更优雅地实现函数指针

6310

C言中指针详解

什么指针 C言中指针一种数据类型,指针存放数据的内存单元地址。 C语言规定,变量地址只能通过取地址运算符获得,即“&”,其运算对象是变量或数组元素名,运算结果对应变量或数组元素的地址。 需要注意的,虽然地址一个整数,但是C言中不允许把整数看成“地址常量”,所以此处的“地址型表达式”不能整数。 2. 使用指针变量 格式:指针变量名 需要使用地址时,可以直接引用指针变量名。 ='\0';string++){ printf("%c",*string); // I love China }; return 0; } C言中,字符串按字符数组进行处理的 形参为指针变量、实参为数组名; 4. 形参为数组名、实参为指针变量 C言中,函数可以返回整型、实型、字符型数据,也可以返回指针类型数据,即返回一个地址。

11620
  • 广告
    关闭

    什么是世界上最好的编程语言?丨云托管征文活动

    代金券、腾讯视频VIP、QQ音乐VIP、QB、公仔等奖励等你来拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C言中指针变量

    #include <stdio.h> //指针变量测试 //指针变量存储的值另一个变量的地址,也就是说改指针变量指向了另一个变量 int main(){ int a=10; //2.定义指针变量时必须带*,定义并初始化,b的值a的内存地址 int* b=&a; //3.打印出指针变量本身的地址 printf("%#X \n ;//输出 0XBFA0ED70 //5.给指针变量赋值时,不用带* b=&c; //6.通过指针变量获取数据时要带*,使用指针间接获取数据 printf("%d \n",*b); //7.通过指针变量修改内存上的数据 *b=30; printf("%d \n",c); 表示获取指针指向的数据,一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p; */ }

    54510

    C言中特殊的指针

    NULL的用法; NULL的源代码: 可以看到NULL的值0,这是一个特殊的地址 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 在C语言或者C++中,NULL指针也是经常使用的。 //2、空指针NULL int *pn = NULL; printf("%#x \n",&pn);//0xaf7df7c8 *pn = 10;//error 会报错 Process finished *pn = NULL; printf("%#x \n",&pn);//0xaf7df7c8 if(pn) { *pn = 10;//error 会报错 Process ; 2、空指针NULL的用法; 3、注意避免产生野指针

    14520

    C言中的迷途指针

    有这样一小段代码,如: int *p=(int *)malloc(sizeof(int)); free(p); 这一段代码,程序会在堆中分配一个整形长度的内存,比如这段内存的首地址1000,那么指针变量 p的值为1000,当调用函数free释放这段内存时,指针变量p的值任然1000,虽然这段内存已被释放,但这段内存中任然可能包含原值,但此生指针p已指向的不是一个有效的对象,因为这段内存可能会被重新利用 ,里面的数据也是不确定的,由于大部分运行时系统不会阻止对后续的访问与修改,所以如果我们试图解引一个已释放的指针,其行为未定义的,那么将可能引起很多问题,如:如果再次访问这段内存,其行为不可预期的、潜在的安全隐患 ,行为不可预期的,虽然你向这段内存中写入了数据,但是这段内存已被释放,这段内存可以重新被利用,所以虽然写入了10,但可能会被其他利用这段内存程序改变,因此行为不可逾期。 小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:870963251!适合在校大学生,小白,想转行,想通过这个找工作的加入。

    41840

    C言中“野指针”、“悬空指针”是什么?

    1、“野指针”(wild pointer) “野指针”(wild pointer):没有被初始化过的指针,所以不确定指针具体指向。 例如以下示例代码: void *p; // 此时 p “野指针” 因为“野指针”可能指向任意内存段,因此它可能会损坏正常的数据,也有可能引发其他未知错误。 在实际的C语言程序开发中,定义指针时,一般都要尽量避免“野指针”的出现,可通过赋初值方式解决: void *p = NULL; void *data = malloc(size); 2、“悬空指针”(dangling pointer) “悬空指针”(dangling pointer):指针最初指向的内存已经被释放了的一种指针。 例如以下示例代码: void *p = malloc(size); assert(p); free(p); // 现在 p “悬空指针C言中的“悬空指针”会引发不可预知的错误,而且这种错误一旦发生

    34850

    C言中只读指针变量与只读变量指针

    只读指针变量和只读变量指针看着好像有点绕; 只读指针变量:意思只读指针的变量 只读变量指针:只读变量的指针 本文的主角const关键字 如果我们开发的时候,定义了某个变量,不想让别人修改时,就可以使用 首先定义两个整型变量 int a = 10; int b = 20; 普通的指针变量 先来看一下普通的指针变量: 我们定义一个普通的int类型的变量a,并初始化为10; 定义一个int类型的指针变量 那么打印出来p的值,就是a的值,10; //普通的指针变量 int *p = &a; printf("%d \n",*p);//10 //指向数值222 *p 也可以修改指针变量的地址; 只读指针变量 //只读指针变量 //这是一个const指针指向的int类型的变量 //const指针指向的整型变量 int *const cp1 = &a; *cp1 = 2;//值可以修改 *cp1 = &b; //cp1 = &b; //指针不能修改 值可以修改; 地址不能修改; 只读变量指针 //一个const指针指向的一个const整型的变量

    24820

    C言中指针数组和数组指针的区别

    在32 位系统下永远占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。 下面到底哪个数组指针,哪个指针数组呢: A) int *p1[10]; B) int (*p2)[10]; 这里需要明白一个符号之间的优先级问题。 “[]”的优先级比“*”要高。 至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的数组的内容,即数组的每个元素。数组在这里并没有名字,个匿名数组。 那现在我们清楚p2 一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解: ? 本文实验以外的部分转载自:http://c.biancheng.net/cpp/html/476.html

    51360

    C言中指针和内存泄漏

    原文出处: IBM developerworks 引言 对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。 指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在 C言中拥有的最强大工具。 本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密。 良好的实践始终结合使用 memset 和 malloc,或者使用 calloc。 内存读取越界 内存读取越界 (overread) 指所读取的字节数多于它们应有的字节数。这个问题并不太严重,在此就不再详述了。下面的代码提供了一个示例。 要避免内存相关的问题,良好的实践: 始终结合使用 memset 和 malloc,或始终使用 calloc。 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。

    1.1K50

    C言中的函数指针(*(void(*)())0)();

    ‘’ 我刚开始学习C语言的时候写简单的数学运算在黑框框里面跑,然后用C语言写51单片机的代码,再到后来玩stm32,学应用层编程,学内核编程等,框架结构逐渐变的复杂,也越来越觉得对C语言的理解还不够到位 个人总结一下C言中有关函数的知识,如有问题请留言指明*v* (*(void(*)())0)(); 其实这个语句只有在微处理器最底层才有可能被调用,因为应用层几乎没有直接对一个地址进行操作的。 什么函数指针变量? 怎么通过函数指针变量调用函数? 函数指针变量怎么定义的? 第一个问题:我们知道一个函数形式 type func(type...) 指针变量因为一个指针所以要用到*取值,那么func就等价于*funcp。考虑到优先级的问题要加上(),所以通过函数指针变量来调用函数(*funcp)(...);。 C语言的函数指针非常重要,大工程里面经常出现各种回调函数,学习的过程中,基本功还是要扎实,不然真的会经常踏入陷阱。 ps:本文参考资料《C陷阱与缺陷》,感兴趣的同学可以读一读

    42920

    c专题之指针-----什么指针

    (这个在实际开发当中,当然没有人吃饱了饭去这样写代码,但是往往在一些公司面试笔试题目就会有这种坑爹的题目,你说你对c语言掌握的好,但是有可能就因为这道题目,叫你说出它的区别了,你一下不知所措了,可能就被 一、什么指针? 变量可以存储数据的,但是指针变量与普通变量不同,它用来存放普通变量的地址,即指针变量用来存放普通变量的指针。 2、指针使用三部曲:定义指针变量、关联指针变量、解引用 (1)当我们int *b定义一个指针变量p时,因为p局部变量,所以也遵循C语言局部变量的一般规律(定义局部变量并且未初始化,则值随机的),所以此时 ,&b,&c,&d,都是打印指针本身的地址(也就可以印证上面说的话,指针和普通变量一样,都有自己的地址)。

    8720

    C言中指针的基础知识

    ,可以参考我这篇: 《C言中的&和*》 3、指针如何作为参数 #include <stdio.h> void maxV(int a,int b,int *max) { if( a > b) { $ vim find_tow_larget.c zhenghui@zhlinux:~/codeProject/11指针$ zhenghui@zhlinux:~/codeProject/11指针$ zhenghui @zhlinux:~/codeProject/11指针$ gcc find_tow_larget.c zhenghui@zhlinux:~/codeProject/11指针$ zhenghui@zhlinux zhenghui@zhlinux:~/codeProject/11指针$ zhenghui@zhlinux:~/codeProject/11指针$ cat find_tow_larget.c #include /a.out 最大的:234,第二大的:8 zhenghui@zhlinux:~/codeProject/11指针$

    13620

    C言中指针的入门理解

    xiaolin、xiaohong的数据类型“指向int型变量的指针型” xiaolin = &xiaozhang; xiaohong = &xiaowang; 从以上赋值语句也可以发现 所以说取地址符(&)不光可以理解为取址运算符,也可以理解为生成指针,表达式&xiaozhang指向xiaozhang的指针,其值为xiaozhang的地址。 指针运算符 在进行显示的地方,就要用到叫作指针运算符的单目运算符*。 将指针运算符*写于指针之前,就可以显示该指针指向的对象内容。 ? *xiaolinxiaozhang的别名。 所以当p指向x时,*p就是x的别名。 所以,如果将指向其他对象的指针赋给指针变量,那么该指针变量就会指向这些对象。

    27640

    再议 C言中指针与数组(4)

    前面的文章中,回顾了 C言中指针,对指针有了一个比较初步的了解。 在本文中,结合数组,再次对指针进行回顾。 二 数组与指针C言中,指向数组的指针比较常见的,也是非常方便和适用的。 多维数组不能以数组名直接作为指针指向的对象,需要稍微做一些调整才能使用数组名作为指针。在 C言中,多维数组实际上就是以一维数组来进行处理的。 也就是说,指针变量 p 指向了一个数组,这个数组的全部元素均为指针。简而言之,指针变量 p 指向指针数组的指针。 三 总结 3.1 在 C言中指针与数组关系密切,既有联系又有区别。 3.2 指针 C言中的精华。作为一名 C 语言学习者,指针虽然比较坑,但是这个无法逃避的,必须花大量的时间与精力去学习与理解。 3.3 指针常常会与数组发生关联,对指针的理解必须透彻。

    58930

    C言中指针占据内存空间问题

    以前一直有个疑问,指向不同类型的指针到底占用的内存空间多大呢? 这个问题我多次问过老师,老师的答案“指向不同类型的指针占据的内存空间大小不同”,我一直很之一这个答案,今天我就做了个小小的实验,发现的确老师的答案错误的。 C言中指针变量占据内存空间的,而且根据不同的开发环境,占据的内存大小不同。 我上网查了些资料; 32位windows系统占用4字节 64位windows系统占用8字节 实施证明,老师说的错的。 好了这点经验分享给大家了,本人初学者,欢迎高手指教。谢谢大家!

    1.5K90

    C言中“悬空指针”和“野指针”究竟是什么意思?

    一、悬空指针 C言中指针可以指向一块内存,如果这块内存稍后被操作系统回收(被释放),但是指针仍然指向这块内存,那么,此时该指针就是“悬空指针”。 下面这段C语言代码一个例子,请看: void *p = malloc(size); assert(p); free(p); // 现在 p “悬空指针C言中的“悬空指针”会引发不可预知的错误 (p); // 避免“悬空指针” p = NULL; 这么做的好处一旦再次使用被释放的指针 p,就会立刻引发“段错误”,程序员也就能立刻知道应该修改C语言代码了。 “野指针”最常来自于未初始化的指针,例如下面这段C语言代码: void *p; // 此时 p “野指针” 因为“野指针”可能指向任意内存段,因此它可能会损坏正常的数据,也有可能引发其他未知错误,所以 C言中的“野指针”危害性甚至比“悬空指针”还要严重。

    8710

    C言中函数指针和回调函数的详解

    大家好,又见面了,我你们的朋友全栈君。 函数指针:指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。 这正如用指针变量可指向整型变量、字符型、数组一样,这里指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。 有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上大体一致的。函数指针有两个用途:调用函数和做函数的参数。 p(100); return 0; } 这里面的pfun代表的函数的类型,通过pfun来代表void (*)(int)函数类型即pfun指针函数的别名,pfun p相当于定义了一个 void 下面看个封装的例子 main.c上层用户开发的 fun.c fun.h开发者开发的 mian.c代码如下 #include "fun.h" #include<stdio.h> #include<

    6810

    初学者对C言中指针的爱恨情仇

    C言中指针和数组的爱恨情仇 一、前言 你可能会有小疑问,爱什么?恨什么? 先说恨吧,相信刚学C语言的同志都恨过。 四、跟我一起学 (一)C言中的*和& 引用我其他博文中的一段话 1、C言中为什么存在&和* C言中大名鼎鼎的“指针”,想必你肯定听说过吧。 没错,C言中的&和*就是为了指针而诞生的。 指针说白了就是直接/间接的操作(取/存)存储中的地址中的数据。 试想一下,如果没有&和*的存在,你可能每天都在为计算和寻找某个变量在哪里而发愁呢! 3、指针中的算术运算 算术运算是什么? 就是从小就会的,加法、减法、乘法、除法。 C言中指针支持三种格式(只有三种,只能三种)的指针算术运算。 开心的这是我用指针写过最长的C语言代码了。 开心的第一次用指针写了一个程序。 刚好对比一下,以前我用Java写的: ? 不得不说C语言的优势就一下子体现出来了。

    13410

    C言中setjmp和longjmp如何工作的?

    C++中可以使用try...catch对异常进行捕获,C语言呢?可能很多人都不知道,C言中也有类似的接口,可以保存程序运行的位置然后在特定的位置进行恢复使得程序能够回到先前保存的地方。 1 int setjmp(jmp_buf env) setjmp需要被先調用,調用之后,setjmp就保存了一份程序的计数器和当前栈顶指针,当然,根据需要也可以保存一些变量的初始化信息。 因为longjmp回到原来保存程序状态的位置,因此也可以称之为从哪里来到哪里去。

    9520

    扫码关注腾讯云开发者

    领取腾讯云代金券