文章目录
- 前言
- 一、正常程序
- 二、获取相同的字符串内容
前言
C / C 编译器会对代码进行 词法分析 , 语法分析 , 句法分析 ;
然后对代码进行优化 ;
将 字符串常量 赋值给指针时 , 首先去 全局变量区 的 常量区 查询该 字符串常量是否存在 ,
- 如果存在 , 直接使用该 字符串常量地址 赋值给
char*
指针 , - 如果不存在 , 直接在常量区 创建一个新的字符串 , 然后将地址 赋值给
char*
指针 ;
下面的
个程序 , 分别演示 不同的字符串常量 和 相同的字符串常量 地址的区别 ;
一、正常程序
分别从两个函数中 , 获取两个不同的字符串 , 打印出这两个 字符串 内容 及 指针指向的地址 ;
代码示例 :
代码语言:javascript复制#include <stdio.h>
/*
* 函数1 返回字符串 1
*/
char *get_str1()
{
char *p1 = "abc";
return p1;
}
/*
* 函数2 返回字符串 2
*/
char *get_str2()
{
char *p2 = "123";
return p2;
}
int main()
{
char *p1 = NULL;
char *p2 = NULL;
// 分别从 2 个函数中获取 2 个字符串
p1 = get_str1();
p2 = get_str2();
// 打印 p1 , p2 指针指向的内存中的字符串数据
// p1=abc, p2=123
printf("p1=%s, p2=%sn", p1, p2);
// 打印 p1 , p2 指针指向的地址
// p1=4210756, p2=4210760
printf("p1=%d, p2=%dn", p1, p2);
return 0;
}
执行结果 : 打印出的字符串内容不同 , 字符串指针地址不同 ;
代码语言:javascript复制p1=abc, p2=123
p1=4210756, p2=4210760
二、获取相同的字符串内容
如果在
个函数中 , 获取的 字符串 是相同的字符串 ;
此时打印出两个函数的指针地址是相同的 , 这是因为 获取的 字符串 都是从 全局区 中的 常量区 中获取的 ;
代码示例 :
代码语言:javascript复制#include <stdio.h>
/*
* 函数1 返回字符串 1
*/
char *get_str1()
{
char *p1 = "abc";
return p1;
}
/*
* 函数2 返回字符串 2
*/
char *get_str2()
{
char *p2 = "abc";
return p2;
}
int main()
{
char *p1 = NULL;
char *p2 = NULL;
// 分别从 2 个函数中获取 2 个字符串
p1 = get_str1();
p2 = get_str2();
// 打印 p1 , p2 指针指向的内存中的字符串数据
// p1=abc, p2=123
printf("p1=%s, p2=%sn", p1, p2);
// 打印 p1 , p2 指针指向的地址
// p1=4210756, p2=4210760
printf("p1=%d, p2=%dn", p1, p2);
return 0;
}
执行结果 :
代码语言:javascript复制p1=abc, p2=abc
p1=4210756, p2=4210756