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
",str1,str2,p1,p2);
    return 0;
}

分析:前两个字符数组,定义在栈上,地址不同。 字符串常量定义在静态区,仅有一份拷贝,所以后面两个指针指向的地址相同。

分析二:

在定义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
",str1,str2,&p1,&p2);
	return 0;
}

因为p1和p2本来就是指针,它们的值(内容)是常量字符串abc的地址,故p1和p2以%d的形式输出是相同的;而&p1和&p2代表的是p1和p2这2个指针的地址.

【p1和p2的内容相同,但存储它们的地方(p1和p2自身的地址)是不同的】

拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
原文地址:https://www.cnblogs.com/dd2hm/p/7269419.html