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

function name address vs array name address

array 变量在编译时会替换成存储ARRAY数据的内存首地址。
所以 array:%p == &array:%p . 
例如 : 
[root@db-172-16-3-150 zzz]# cat f.c
#include <stdio.h>

char a[10] = "abcde";

int main() {
  fprintf(stdout, "a:%p, &a:%p\n", a, &a);
  return 0;
}
结果
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./f.c -o f && ./f
a:0x6008bc, &a:0x6008bc


function 名则更猛.
function:%p == &function:%p == *function:%p
说明函数名是个指针, 指针的内容就是这个指针的地址本身.
因此使用函数名, 或者*function 或者&function都可以调用这个函数.
例如 : 
[root@db-172-16-3-150 zzz]# cat f.c
#include <stdio.h>

int test() {
  fprintf(stdout, "test output\n");
  return 1;
}

int main() {
  int test1() {
    return 2;
  }

  int a = test1();
  int b = (&test)();  // 使用&test调用这个函数
  int c = (*test)();  // 使用*test调用这个函数

  fprintf(stdout, "a:%i, b:%i, c:%i\n", a, b, c);
  fprintf(stdout, "test:%p, &test:%p, *test:%p\n", test, &test, *test);
  fprintf(stdout, "test1:%p, &test1:%p, *test1:%p\n", test1, &test1, *test1);
  fprintf(stdout, "test1+1:%p, (&test1)+1:%p, (*test1)+1:%p\n", test1+1, (&test1)+1, (*test1)+1);
  return a;
}
结果
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./f.c -o f && ./f
test output
test output
a:2, b:1, c:1
test:0x400540, &test:0x400540, *test:0x400540
test1:0x400530, &test1:0x400530, *test1:0x400530
test1+1:0x400531, (&test1)+1:0x400531, (*test1)+1:0x400531  // 这里+1都加了一个字节, 而存储0x400531这个值需要2个字节, 所以看起来就不对劲了.
// 这些可能都是编译器使的障眼法. 函数指针可能另有所指, 那就是code区域. 

函数创建时, 这个函数指针将在内存的constants区域创建.  
从打印结构来看,  function:%p == &function:%p == *function:%p .但是这可能是编译器搞的鬼. 函数指针肯定是要执行函数体的code区域的, 
来看一幅图 : 
function name address vs array name address - 德哥@Digoal - The Heart,The World.

相关文章:

  • 关于加载本地加载ga.js文件的问题
  • Jdev Run Page 没有反应
  • spring3 的restful API RequestMapping介绍
  • SQL数据库还原时备份集中的数据库备份与现有的数据库不同的解决办法
  • 单元测试
  • 我理解的--java门面模式
  • yii create url (一)
  • Android MediaPlayer Error/Info Code
  • Nginx服务器防止负载过高模块sysguard
  • 矩阵的存储及快速转置
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]
  • USB2.0学习笔记连载(九):USB设备驱动的安装
  • PHP语言 -- 面向对象
  • spring 中IOC和aop的理解
  • keepalived which time exec track script , notify script when vrrp transition
  • [笔记] php常见简单功能及函数
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 03Go 类型总结
  • CSS实用技巧
  • ES6之路之模块详解
  • gitlab-ci配置详解(一)
  • GraphQL学习过程应该是这样的
  • IDEA 插件开发入门教程
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JS变量作用域
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Node项目之评分系统(二)- 数据库设计
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 关于springcloud Gateway中的限流
  • 再次简单明了总结flex布局,一看就懂...
  • 栈实现走出迷宫(C++)
  • 正则表达式小结
  • scrapy中间件源码分析及常用中间件大全
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • !$boo在php中什么意思,php前戏
  • # .NET Framework中使用命名管道进行进程间通信
  • #define
  • #LLM入门|Prompt#3.3_存储_Memory
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (07)Hive——窗口函数详解
  • (层次遍历)104. 二叉树的最大深度
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六)vue-router+UI组件库
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • .bat批处理(六):替换字符串中匹配的子串
  • .cfg\.dat\.mak(持续补充)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net网站发布-允许更新此预编译站点
  • .net中的Queue和Stack
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...