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用法、常量字符串的应用的更多相关文章

  1. extern用法

    Extern用法 用例子给你示范 // 1.cpp ; // 2.cpp 注意没有包含1.cpp #include <iostream> using namespace std; exte ...

  2. Java常量字符串String理解

    Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用  "eq ...

  3. C# 16进制与字符串、字节数组之间的转换(转)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToSt ...

  4. C/C++中常量字符串管理

    为了节省内存,C/C++把常量字符串放到单独的一个内存区域.当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址.但用产量初始化字符数组,结果却不同. 下面是一个小程序示例: #incl ...

  5. extern用法详解

    1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern也可用来进行链接指定. 2 问题:ext ...

  6. carryLess小笔记001_Java中16进制与字符串之间的相互转换

    笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网上找到了一些方法尝试之后,均发现存在一个问题-->字符串转为16进制后再转回来,英文正常,中文出现乱码 经过考虑决定通过以下方式进 ...

  7. IDEA 编译时 报 “常量字符串过长” 解决办法

    从eclipse 工具转到 IDEA 工具的时候,出现了一些问题,在这里记录一下,以便之后使用到,废话不多说. 在编译项目时,出现错误为:"常量字符串过长" ,我当时想这个问题需要 ...

  8. C# 16进制与字符串、字节数组之间的转换 (转载)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine(, )); //十进制转八进制 Console.WriteLine(, )); / ...

  9. C#串口通讯,16进制与字符串、字节数组之间的转换。

    1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, ...

随机推荐

  1. cogs 444. [HAOI2010]软件安装

    ★★☆   输入文件:install.in   输出文件:install.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述]现在我们的手头有N个软件,对于一个软件i,它要 ...

  2. Python3基础 global 使函数中的局部变量升格为全局变量

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. JQuery使用教程

    jQuery简介 jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team jQuery是对原生JavaScript二次封装的工具函数集合 ...

  4. return false break;

    js中的return false;  break; , , , , ]; var list2 = ['a', 'b', 'c', 'd']; ; j < list2.length; j++) { ...

  5. 移动端Css初始化

    @charset "utf-8"; /* 禁用iPhone中Safari的字号自动调整 */ html { -webkit-text-size-adjust: %; -ms-tex ...

  6. C#学习笔记(四):switch语句

    条件语句 switch语句快速生成枚举方法,复制枚举名在switch()里,双击TAB 快速生成方法,用纠错功能 随机数 using System; using System.Collections. ...

  7. HDU 5887 Herbs Gathering(搜索求01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=5887 题意: 容量很大的01背包. 思路: 因为这道题目背包容量比较大,所以用dp是行不通的.所以得用搜索来做, ...

  8. NOI 16 买房子

    买房子(NOI 16) 总时间限制: 1000ms 内存限制: 65536kB 描述 某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K ...

  9. asp.net <asp:Repeater>下的 asp:LinkButton CommandArgument点击事件

    前台 <asp:Repeater ID="rptData" runat="server" OnItemCommand="rptData_Item ...

  10. hdu 5525 Product 数论算贡献

    Product Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Proble ...