c语言指针

函数指针与指针函数,将直接写入内存的操作码转成函数指针并调用

混江龙づ霸主 提交于 2019-12-03 20:28:14
函数指针与指针函数 阅读hotspot的代码,需要先弄清楚这两个很容易混淆的概念。 最近我想到一个办法去区分折扣两个,就是在中间加个“的”: 函数的 指针 指针的 函数 这样就很容易区分了。 函数指针,实际上是指针,是指向函数的指针 指针函数,实际上函数,是指返回指针的函数 其实在C语言中,指针数组和数组指针也是一样的区分办法。 加个“的”便可以解决。 为什么会有这样的问题?老外怎么理解这个事情?我得回去翻翻K&R的那本C的英文教材。TODO。 指针函数 是指返回指针的函数,比如: int *fun (int a, int b) { int c = a + b; return &c; // 返回一个指针 } 函数指针 是指指向函数的指针 #include <stdio.h> int (* fun)(int a, int b); // fun 就是指向函数的指针变量 int add (int a, int b) { int c = a + b; return c; } int main(){ fun = add; int result = fun(100, 200); printf("result=%d\n", result); } 函数指针定义成类型 还可以结合类型声明将函数指针定义成类型 #include <stdio.h> // 定义一个 返回值是int

C语言-指针变量

跟風遠走 提交于 2019-12-03 19:59:22
1 内存大小 1K Byte 0x00-->0X400 0-->2 11 =1024 2K Byte 0x00-->0X800 0-->2 12 =2048 4K Byte 0x00-->0X1000 0-->2 12 =4096 1M Byte 0x00-->0X10 0000 0-->2 20 2M Byte 0x00-->0X20 0000 0-->2 21 4M Byte 0x00-->0X40 0000 0-->2 22 1G Byte 0x00-->0X4000 0000 0-2 30 2G Byte 0x00-->0X8000 0000 0-->2 31 4G Byte 0x00-->0X1 0000 0000 0-->2 32 2 地址与内容 char *p_char:内存中每个位置可以存储1个字节,每个位置8位,可以表示无符号0~255,或者有符号-128~127 char *p_int:内存中每个位置可以存储4个字节,每个位置32位,可以表示无符号0~2 32 -1,或者有符号-2 31 ~2 31 -1 3 指针变量的定义 方法1:先定义,再赋值 float a=99.5; float *p_a;  //定义指针变量 p_a = &a;   //指针变量赋值 p_a指向变量a的地址 printf("p_a = %#x\r\n", p_a); printf("a

C语言函数指针基础

回眸只為那壹抹淺笑 提交于 2019-12-03 17:30:00
  C语言函数指针基础   本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础。如果你不讨厌事无巨细,请尽情阅读吧。   函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具。本文将从C语言函数指针的基础开始介绍,再结合一些简单的用法和关于函数名称和地址的趣闻。在最后,本文给出一种简单的方式来看待函数指针,让你对其用法有一个更清晰的理解。   函数指针和一个简单的函数   我们从一个非常简单的”Hello World“函数入手,来见识一下怎样创建一个函数指针。      我们定义了一个名为sayHello的函数,它没有返回值也不接受任何参数。当我们在main函数中调用它的时候,它向屏幕输出出”hello world“。非常简单。接下来,我们改写一下main函数,之前直接调用的sayHello函数,现在改用函数指针来调用它。      第二行void (*sayHelloPtr)()的语法看起来有些奇怪,我们来一步一步分析。   1. 这里,关键字void的作用是说我们创建了一个函数指针,并让它指向了一个返回void(也就是没有返回值)的函数。   2. 就像其他任何指针都必须有一个名称一样,这里sayHelloPtr被当作这个函数指针的名称。   3. 我们用*符号来表示这是一个指针,这跟声明一个指向整数或者字符的指针没有任何区别。  

一道90%都会做错的指针题

时光怂恿深爱的人放手 提交于 2019-12-03 15:14:47
今天,在我们的一个小群里,一个同学发了一道题目给我看,这道题目应该是C语言面试的一股清流了,各种招聘笔试上都可以看到,我试着发到我的大群里去,发现有人对这个理解不是很深刻,所以再发出来, 知识总是在不断的碰撞中提高的 ,同理,球技也是一样。 大家可以先猜测一下这两个程序的输出是什么? 什么是指针? 书籍看得比较多了,这个指针那个指针,但是我认为如果说到指针,不说变量,就有点耍流氓,所以我认为理解指针的基础就要理解它是一个变量,所以指针,可以理解为指针变量,再延伸出来,就是 地址变量,可以存地址的一个变量,而且存的这个地址指向的类型也是有要求的 。 #include "stdio.h" int main() { int i = 12; int *p = &i; printf("%d\n",sizeof(int *)); printf("%d\n",sizeof(p)); printf("%p\n",&p); } 看上面的代码,p是一个指针变量,p存的是一个地址,p存的这个地址存的类型是 int 类型。有点拗口,我们画个图。 上图中 我们定义了一个变量 p ,所以编译器就必须要给这个p分配内存,如上图所示,这个p的内存是 0x1000,p是什么类型呢?从定义可以看,p的类型是 int *,所以说p只可以存 int * 类型的值,也就是一级指针,就是一级地址,也就是 i 的地址。 i

CString, BSTR, LPCTSTR 概念

纵饮孤独 提交于 2019-12-03 13:21:59
CString是一个动态TCHAR数组 , BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵 ) LPCTSTR只是一个常量的TCHAR指针。 CString 是一个完全独立的类,动态的TCHAR数组,封装了+等操作符和字符串操作方法。 typedef OLECHAR FAR* BSTR; typedef const char * LPCTSTR; vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。 1. LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的. 2. C表示const 3. T是TCHAR,在采用Unicode方式编译时是wchar_t,在普通时编译成char. 为了满足程序代码国际化的需要,业界推出了Unicode标准

然并卵:BF 科普 & BF 解释器的 JS 实现

会有一股神秘感。 提交于 2019-12-03 10:14:45
本文转载于: 猿2048 网站➫ https://www.mk2048.com/blog/blog.php?id=i02a0ij1kj 最近在 Codewars 上做练习,某道题的内容是实现一个 brainFuck(简称BF语言) 解释器(c/python/js等等均可)。动手实践的过程还是很有趣的,中间也遇到了各种各样的问题,最终通过测试,代码也比较接近目前的 JS 高分 solution。这篇文章准备聊聊相关的一些知识和实现的细节。 “脑洞大开”的语言 —— BF 简介 BrainFuck(后文以简写BF指代),单是名字就很容易让人脑洞大开,有种不可描述的“哲学”韵味。所以如果你忍不住 google 一下相关图片的话,你会可能搜到类似下面的图片: 画面是不是已经很生动了? BF 字面上的含义已经暗示了这是一种不太直观和容易阅读的语言,当然,在当下也不会是一种通用语言。她属于 Esolang(全称 Esoteric programming language,直译:深奥的编程语言) 的范畴。 BF诞生于上世纪30年代,曾运用于早期的 PC(Amiga),想详细了解的童鞋可以浏览 维基百科 。 BF 在当下有什么应用场景呢? 我想,对一个吃瓜群众来说,了解了它,对写作 逼格 和 脑力 的提升是很有用的。BF 具有 极简主义 (搞设计的童鞋的不妨了解下下)和 功能齐全 (图灵完全

最基础的数据结构-左轻侯

一曲冷凌霜 提交于 2019-12-03 06:07:53
作者:左轻侯 创建时间:2007-03-04 22:29:06 最后修改时间:2008-01-18 22:07:52 本文发表于《程序员》2007年第3期      最基础的数据结构   左轻侯   2007.2.3      引言       任何一个受过专业训练的程序员,对“数据结构”这门课程中涉及到的各种数据结构都不会感到陌生。但是,在实际的编程工作中,大部分的数据结构都不会用到,而且也许永远都不会用到。造成这种现象的原因有二:一是根据80/20法则,常用的数据结构只会占到少部分;二是计算机语言往往已经对常用的数据结构进行了良好的封装,程序员不需要关心内部的实现。    虽然如此,深入地理解基本数据结构的概念和实现细节,仍然是每一个程序员的任务。这不仅是因为,掌握这些知识,将有利于更加正确和灵活地应用它们,而且也是因为,对于语言背后的实现细节的求知欲,是一个优秀的程序员的素质。    本文将讨论实际编程最经常使用的三种数据结构:字符串、数组和Hash表,比较它们在不同语言中的实现思路,并涉及它们的使用技巧。      字符串    严格地说,字符串(string)甚至不能算作一种单独的数据结构,至少在C语言中,它仅仅是某种特定类型的数组而已。但是,字符串在实际使用中是如此重要,在不同语言中的实现又差异颇大,因此,它值得被作为一种抽象数据类型单独进行讨论

C语言qsort函数总结

一个人想着一个人 提交于 2019-12-03 05:25:08
   前几天在leetcode上刷题,用qsort对二维数组进行排序,发现不会写qsort的比较函数。后面在网上找了几篇博客才弄明白,趁今天有空,对这个做一下总结,主要是以下4个方面: 1、qsort总体介绍 2、qsort应用于一维数组 3、qsort应用于指针数组 4、qsort应用于二维数组 1、qsort总体介绍   函数声明:void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void *, const void*))   参数解释:     base-- 指向要排序的 数组 的第一个元素的指针。注意这里说是数组,所以必须是对连续的内存块进行排序。     nitems-- 由 base 指向的数组中元素的个数     size-- 数组中每个元素的大小,以字节为单位     compare-- 用来比较两个元素的函数。这是qsort最难的一部分了。这里主要要注意以下2点:1、在写compare函数时,你的两个形参必须是const void *型,但是在compare函数内部你又必须将const void *类型的形参转换为实际的类型。这是我最当时最难以理解的一个问题了:我需要转换成什么类型。看了别人的总结才知道,是: 指向数组元素的指针,指向数组元素的指针,指向数组元素的指针

iphone 面试题(转)

廉价感情. 提交于 2019-12-03 04:51:19
转】 iPhone 面试题解答 2011-07-20 0:51 转载自 492437598 最终编辑 492437598 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); } 答:2,5 *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5   &a+1不是首地址+1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int)   int *ptr=(int *)(&a+1);   则ptr实际 是&(a[5]),也就是a+5 原因如下:   &a是数组指针,其类型为 int (*)[5];   而 指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。   a是长度为5的int数组指针,所以要加 5*sizeof(int)   所以ptr实际是a[5]   但是prt与(&a+1)类型是不一样的(这点很重要)    所以prt-1只会减去sizeof(int*)   a,&a的地址是一样的,但意思不一样 a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址, a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]. 2. 以下为Windows NT下的32位C+

文件操作

匿名 (未验证) 提交于 2019-12-03 00:39:02
(转)http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html C语言文件操作详解 C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:       文件的打开操作 fopen 打开一个文件       文件的关闭操作 fclose 关闭一个文件       文件的读写操作 fgetc 从文件中读取一个字符               fputc 写一个字符到文件中去               fgets 从文件中读取一个字符串               fputs 写一个字符串到文件中去               fprintf 往文件中写格式化数据               fscanf 格式化读取文件中数据               fread 以二进制形式读取文件中的数据               fwrite 以二进制形式写数据到文件中去               getw 以二进制形式读取一个整数               putw 以二进制形式存贮一个整数     文件状态检查函数 feof 文件结束               ferror 文件读/写出错               clearerr 清除文件错误标志