本书为Linux高级编程(第三版)杨宗德等著 人民邮电出版社
书上42页第6点数据常量:
#include <stdio.h>
char *a="hello";
void test(void)
{
char *c="hello";
if(a==c) //测试子函数中局部变量c和全局变量a是否指向同一字符串
printf("yes,a==c\n");
else
printf("no,a!=c\n");
}
int main(void)
{
char *b="hello";
char *d="hello1";
if(a==b) //测试a、b是否指向同一字符串
printf("yes,a==b\n");
else
printf("no,a!=b\n");
test(); //在子函数中测试
if(a==d) //测试前几个字符串相同的两字符串是否优化存储在同一位置
printf("yes,a==d\n");
else
printf("no,a!=d\n");
return 0;
}
编译运行过程如下:
root@rhoda-Lenovo-N480:~/桌面# gcc -o Test Test.c
root@rhoda-Lenovo-N480:~/桌面# ./Test
yes,a==b
yes,a==c
no,a!=d
这里插入一个Ubuntu用终端运行程序的解释:第一个Test是编译后的文件名,第二个是代码所在的文件名
重要的是,这里看不出测试字符串常量是否存储在同一地址,而且效果类似函数strcmp(str1,str2)
但是要在文件头加#include "string.h"
代码如:
#include <stdio.h>
#include "string.h"
char *a="hello";
void test(void)
{
char *c="hello";
if(strcmp(a,c)==0) //测试子函数中局部变量c和全局变量a是否指向同一字符串
printf("yes,a==c\n");
else
printf("no,a!=c\n");
}
int main(void)
{
char *b="hello";
char *d="hello1";
if(strcmp(a,b)==0) //测试a、b是否指向同一字符串
printf("yes,a==b\n");
else
printf("no,a!=b\n");
test(); //在子函数中测试
if(strcmp(a,d)==0) //测试前几个字符串相同的两字符串是否优化存储在同一位置
printf("yes,a==d\n");
else
printf("no,a!=d\n");
return 0;
}
运行结果一样,这时应该如何改才与书本对应呢,做一个简单的代码对比:
#include<stdio.h>
void main()
{
//定义
char a[]="hello";
char b[]="hello";
char *c="hello";
char *d="hello";
//输出地址(十六进制)
printf("对应的地址:\n");
printf("a=%p\n",a);
printf("b=%p\n",b);
printf("c=%p\n",c);
printf("d=%p\n",d);
printf("判断是否相等:\n");
if(a==b)
printf("a==b\n");
else
printf("a!=b\n");
if(c==d)
printf("c==d\n");
else
printf("c!=d\n");
//由于字符数组的值不是常量可以修改
a[1]='E';
//输出指向字符串
printf("对应的字符串:\n");
printf("a=%s\nb=%s\n",a,b);
printf("c=%s\nd=%s\n",c,d);
}
输出结果为:
对应的地址:
a=0x7ffe50509ed0
b=0x7ffe50509ee0
c=0x400794
d=0x400794
判断是否相等:
a!=b
c==d
对应的字符串:
a=hEllo
b=hello
c=hello
d=hello
最后可以确定(char *)指向的字符串是一个字符串常量保存在一个特定位置(代码段中),(char[])保存的是变量可以修改