当前位置: 首页 > news >正文

广州住房和建设局网站官网山东济南网站建设

广州住房和建设局网站官网,山东济南网站建设,东莞网站建设必要性,wordpress首页调用文章多张图片文章目录 一、指针 二、指针的初始化 三、指针的运算 四、指针与数组 五、指针与字符串 六、函数指针 七、NULL 指针 八、对复杂指针的解释 C 语言指针真正精髓的地方在于指针可以进行加减法#xff0c;这一点极大的提升了程序的对指针使用的灵活性#xff0c;同时也… 文章目录 一、指针 二、指针的初始化 三、指针的运算 四、指针与数组 五、指针与字符串 六、函数指针 七、NULL 指针 八、对复杂指针的解释 C 语言指针真正精髓的地方在于指针可以进行加减法这一点极大的提升了程序的对指针使用的灵活性同时也带来了不小的学习负担。正是因为 C 语言指针可运算才奠定了如今 C 语言的地位。 一、指针 对于内存我们可以简单地认为它就是大小相同、连续排布的格子每一个格子的大小为一字节。为了更方便地找到某一个格子我们通过对内存进行编号通过编号来找到某一个具体的内存格子。 这样的编号通常称之为内存地址如果程序想要获取某一块内存存放的数据必须通过内存地址定位再取出对应内存的数据。 一个指针变量存储着另一块内存的起始地址相较于直接寻址的方式如果想要通过一个指针获取指向的内存变量的话首先需要获取到指针变量存储的内存地址再通过这个地址来获取变量所以这种方式又称为间接寻址。 在 C 函数实现中所传入的参数均为原有变量的一个拷贝在函数中对参数进行修改是无法影响到原有变量的值的若需要对参数进行修改可向函数传递该变量的内存地址。如此一来即使对参数地址进行了拷贝也可以通过地址对其进行修改而变量的地址就保存在指针当中。 二、指针的初始化 操作符 表示取一个变量的地址并将该地址赋给变量 pointer由此一来指针中的地址就是正确且合法的。 void main() {int number 100;int *pointer;pointer number; }三、指针的运算 C 语言中的指针支持运算不过仅支持加减法并不支持乘除法。在前面我们已经提到过了一元运算符 * 表示间接寻址即取出指针的地址根据该地址找到指针指向的变量。而对于指针的加减法而言与指针指向的类型密切相关。 可以看到对一个指向 int 的指针加 1其地址增加了 4正好是一个整型的大小。其原因在于如果仅仅是增加 1 的话那么指针将会指向该整型的第二个字节那么此时指针所指向的“整型”值将会变得非常奇怪因为最后一个字节是其它数据的。 四、指针与数组 我们经常听到数组名称其实就是一个指针数组名表示数组的首地址。但是这并不正确数组名称和指针绝不等价我们可以认为数组名称具有指针的特性但不能说数组和指针等价。一个最为典型的例子就是使用 sizeof 求数组的长度。 #include stdio.hvoid main() {int number[] {1, 2, 3};int *pointer number;printf(numbers size: %ld \n, sizeof(number));printf(pointers size: %ld \n, sizeof(pointer)); }// numbers size: 12 // pointers size: 4 在上述代码中我们明确地表示了 number 是一个整型数组表示整型的集合所以 sizeof 的结果为数组占用内存的总大小。而 pointer 仅仅只是一个整型指针编译器并不知道它到底是指向一个整型还是一坨整型那么 sizeof 的结果自然而然的是指针占用内存空间的大小。 所以数组名称所代表的含义要高于指针但是这并不改变数组名是一个指针的事实。数组在内存中连续分布再结合前面所提到的指针的运算使得我们可以通过指针的方式访问数组中的元素。 五、指针与字符串 C 语言中字符串并非像其它语言一样将其设置为基本数据类型而是构建于数组之上并在数组末尾添加 \0 表示结尾这也是为什么数组和字符串经常成对出现的原因。 int main() {char *hello {Hello};char world[] {World};printf(hello: %s \n, hello);printf(world: %s \n, world); }如上述代码所示我们既可以使用数组初始化一个字符串也可以使用字符指针来初始化一个字符串只不过使用字符指针初始化的字符串具有只读特性使用数组初始化的字符串具有读写特性。 六、函数指针 在函数式编程中我们经常需要将一个函数作为参数传递给另外一个函数其中比较经典的例子线程的创建与执行。不同于 fork 或者 vfork 调用pthread_create 调用以一个函数指针作为参数创建的线程转而执行该函数。 int filterArray(int *array, int size);上述代码是一个简单的函数原型接收一个整型数组和其长度并返回一个整型。一个函数总是占用一段连续的内存区域函数名称在某些情况下会被转换成该函数所在内存区域的首地址这一点和数组非常的相似。也就是说函数名称 filterArray 可以被替换成 (*pointerName)这样一来就得到了一个指向函数入口的指针 int (*pointerName)(int *array, int size);所以函数指针其实就是对函数原型的稍加修改而已。 七、NULL 指针 标准定义了 NULL 指针它作为一个特殊的指针变量表示不指向任何东西当我们在定义一个指针变量并且不知道该指针指向何处时就应该将其初始化为 NULL。其次当我们使用 free 函数释放堆内存时也应该将指针指向为NULL防止出现内存访问错误。 #include stdlib.hint main() {char *s NULL;s (char *)malloc(sizeof(char) * 5);strcpy(s, hello);free(s);s NULL;return 0; }对NULL 指针进行解引用是非法的因为 NULL指针从定义上来看不指向任何东西。因此当我们对指针进行解引用时应该对其进行检查能显著减少 DEBUG 的时间。 八、对复杂指针的解释 有时候我们会看到诸如 char *(*name[124])(int **p) 这种看起来非常复杂的指针对于此类复杂指针我们只需要牢记两个关键点即可。 对于一个符号定义而言找到其名称然后再按照优先级顺序进行解析。 牢记 C 语言中操作符的优先级。 操作符描述()聚组例如5 / (2 3)和数学中的()语义相同()函数调用例如 3 foo()首先调用函数而后执行加法操作[]下标引用例如 foo()[2]首先调用函数根据函数返回的结果进行下标引用.访问结构体成员如 student[1].name 首先获取数组索引为1的元素而后访问name成员-访问结构指针成员和 . 作用相同后缀自增如 struct.name首先获取结构体成员再对其进行自增–后缀自减同后缀自增!逻辑反~按位取反前缀自增–前缀自减*间接访问如 *p 首先对指针 p 进行自增然后对自增后的指针进行间接访问取变量地址 可以看到* 间接访问操作的优先级要远远低于()、[]、 以及 . 等常用操作符也就是说* 在复杂指针中就是个弟弟。 接下来就对 char *(*name[124])(int **p) 这个指针做一个具体的分析。首先得找到变量名称上面有两个 name 以及 p结合外面两对括号可知这是个函数指针p 为函数参数。再来看 *name[124][]的优先级高于 *所以 name 是一个数组数组中保存了某种类型的指针。将所有的信息整合起来就可以得到name 是一个指针数组保存了原型为 char *funcName(int **p) 的函数指针。
http://www.hkea.cn/news/14322390/

相关文章:

  • 游泳池建设有专门的网站吗最近的新闻事件
  • 网站个人博客怎么做湖南人文科技学院官网首页
  • 怎么才能搜索到自己做的网站国外论文类网站有哪些方面
  • 衡阳市建设协会网站手机社区网站模板
  • 免费建网站 步骤超级软文网
  • 做网站的皮包公司爱站网能不能挖掘关键词
  • 深圳做app网站大展建筑人才网
  • 江门网站建设推广家装要去哪个公司装修
  • 有啥创意可以做商务网站的株洲seo
  • 东莞企业高端网站建设安卓开发工具手机版
  • 长春网站制作公司游戏广告联盟平台
  • 百度不更新网站张雪峰最不建议上的专业
  • 电子商务网站开发书代码统计网站
  • 牡丹江网站seo网站开发 荣誉资质
  • 东莞技术支持网站建设专家公司营业执照查询
  • 网站外链建设可以提升网站权重对还是错长春建站平台
  • 企业管理咨询网站模板泰安公司注册
  • 1网站免费建站免费营销网站制作模板
  • 旅游景区网站建设方案文档东莞洪梅网站建设
  • 网站空间后台密码网站后台怎么做alt标签
  • html5快速建站怎么把自己网站推广出去
  • 福州英文网站建设国外企业网络研究
  • 郴州网站策划做短视频网站收益
  • 网站建设与设计试题郑州新闻
  • 快速做课件的网站wordpress 权限控制
  • 织梦做网站视频教程在线网站建设哪个正规
  • 网站推广策略100例电子商务网站 方案
  • 滨海企业做网站多少钱免费签名设计在线生成
  • 南阳商都网站做网站网页加速器手机版
  • 网站建立需要哪些材料建设人力资源网官网