16 extern用法、常量字符串的应用
extern声明多文件共享变量的方法总结一下:
1).在一个源文件中定义,在其他需要使用的源文件中用extern声明。(仅一处定义,多处extern)
2).在一个源文件中定义,在其对应的头文件中extern声明,在其他需要使用该共享变量的源文件中包含该头文件即可。(更加标准的做法)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在gcc编译器下,分析下列程序
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
const char str1[]="abc";
const char str2[]="abc";
const char *p1="abc";
const char *p2="abc";
printf("%d %d %d %d\n",str1,str2,p1,p2);
return ;
}
分析:前两个字符数组,定义在栈上,地址不同。 字符串常量定义在静态区,仅有一份拷贝,所以后面两个指针指向的地址相同。
分析二:
在定义char数组时,会将常量字符串中的值拷贝到字符数组中,因而str1与str2指向的位置不同。但是定义的两个char*指针,p1,p2,都是指向常量区的同一个字符串,因而两者相同。
当把p1,p2改成 &p1,&p2时会发现下列程序的打印结果都是不同的。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
const char str1[]="abc";
const char str2[]="abc";
const char *p1="abc";
const char *p2="abc";
printf("%d %d %d %d\n",str1,str2,&p1,&p2);
return 0;
}
因为p1和p2本来就是指针,它们的值(内容)是常量字符串abc的地址,故p1和p2以%d的形式输出是相同的;而&p1和&p2代表的是p1和p2这2个指针的地址.
【p1和p2的内容相同,但存储它们的地方(p1和p2自身的地址)是不同的】
16 extern用法、常量字符串的应用的更多相关文章
- extern用法
Extern用法 用例子给你示范 // 1.cpp ; // 2.cpp 注意没有包含1.cpp #include <iostream> using namespace std; exte ...
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- C# 16进制与字符串、字节数组之间的转换(转)
1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToSt ...
- C/C++中常量字符串管理
为了节省内存,C/C++把常量字符串放到单独的一个内存区域.当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址.但用产量初始化字符数组,结果却不同. 下面是一个小程序示例: #incl ...
- extern用法详解
1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern也可用来进行链接指定. 2 问题:ext ...
- carryLess小笔记001_Java中16进制与字符串之间的相互转换
笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网上找到了一些方法尝试之后,均发现存在一个问题-->字符串转为16进制后再转回来,英文正常,中文出现乱码 经过考虑决定通过以下方式进 ...
- IDEA 编译时 报 “常量字符串过长” 解决办法
从eclipse 工具转到 IDEA 工具的时候,出现了一些问题,在这里记录一下,以便之后使用到,废话不多说. 在编译项目时,出现错误为:"常量字符串过长" ,我当时想这个问题需要 ...
- C# 16进制与字符串、字节数组之间的转换 (转载)
1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine(, )); //十进制转八进制 Console.WriteLine(, )); / ...
- C#串口通讯,16进制与字符串、字节数组之间的转换。
1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, ...
随机推荐
- noip2010 真题练习 2017.2.18
第一题比较简单,用exist数组判断是否在循环队列中,就可实现线性算法. Code #include<iostream> #include<cstdio> #include&l ...
- Pycharm 2017 激活码
Pycharm 2017 激活码 server选项里边输入: http://idea.liyang.io 我是通过这个成功的
- Python3基础 file seek 将文件的指针恢复到初始位置
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 再谈vim中多窗口的编辑 ctrl+w+H窗口位置最大化和互换等操作
参考:http://blog.csdn.net/shuangde800/article/details/11430659 很好 鼠标在各个窗口间循环移动: ctrl+w+(小写的 hjkl), &qu ...
- P3870 [TJOI2009]开关
思路 重题 代码 #include <iostream> #include <vector> #include <cstdio> #include <cstr ...
- Java LinkedList源码剖析
LinkedList 本文github地址 总体介绍 LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个 ...
- Spring报NoSuchBeanDefinitionException
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 上述可以看出Ac ...
- 【Coursera】Third Week(2)
拾遗 Steve Jobs与World Wide Web 如果你有仔细观察Robert Cailliau的视频的话,你会发现他工作所用的电脑为NeXT电脑. Jobs 也对web 产生了一定的影响,众 ...
- C++ 实验2:函数重载、函数模板、简单类的定义和实现
1.函数重载编程 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型数据,调用测试. #include <iostream> ...
- 对 Kotlin 与 Java 编程语言的思考
从长远来看,排名前10的也基本上是Java.C.C++.Python.C#.VB.PHP.JavaScript.至于Kotlin的排名,11月份在编程语言仅排41名,Ratings仅有0.216%. ...