C 字符串、常量、复合文字的持续时间,以及为什么不包括代码本身

C 字符串、常量、复合文字的持续时间,以及为什么不包括代码本身,c,C,我不记得在哪里读到过,如果我把一个字符串传递给一个函数,比如。 字符*字符串; string=func(“heyapple!”); char*func(char*string){ 字符*p p=字符串 返回p; } printf(“%s\n”,字符串); 字符串指针仍然有效,因为“heyapple!”在内存中,在我编写的代码中,所以它永远不会被删除,对吗 关于常数,比如1,2.10,a 复合文字呢 如果我这样做: func(1,'a',“string”) 只有字符串将是我所有的程序执行,或者

我不记得在哪里读到过,如果我把一个字符串传递给一个函数,比如。

字符*字符串;
string=func(“heyapple!”);
char*func(char*string){
字符*p
p=字符串

返回p; } printf(“%s\n”,字符串);

字符串指针仍然有效,因为“heyapple!”在内存中,在我编写的代码中,所以它永远不会被删除,对吗

关于常数,比如1,2.10,a

复合文字呢

如果我这样做:
func(1,'a',“string”)

只有字符串将是我所有的程序执行,或者constans也将是

例如,我知道我可以用字符串的地址来做
&“string”

我可以获取常量文本的地址吗?比如1,2.10,a

我将这些传递给函数和参数,它需要有静态的持续时间,就像没有单词static的字符串一样


非常感谢。

这没有多大意义

不是指针的值不能被“释放”,它们是值,它们不能消失

如果我这样做:

int c = 1;
变量“c”不是指针,它只能包含整数值,更具体地说,它不能包含整数值。这就是它所做的,没有其他选择

在实践中,文本将被编译到生成的机器代码中,因此在由上述代码生成的代码中的某个地方

load r0, 1

或者底层指令集的汇编程序看起来像什么。“1”是指令编码的一部分,它不能消失。

这没有什么意义

不是指针的值不能被“释放”,它们是值,它们不能消失

如果我这样做:

int c = 1;
变量“c”不是指针,它只能包含整数值,更具体地说,它不能包含整数值。这就是它所做的,没有其他选择

在实践中,文本将被编译到生成的机器代码中,因此在由上述代码生成的代码中的某个地方

load r0, 1

或者底层指令集的汇编程序看起来像什么。“1”是指令编码的一部分,它不能消失。

确保区分值和指向内存的指针。指针本身就是值,但它是一种特殊的值,包含指向内存的地址

使用
char*hello=“hello”,发生了两件事:

  • 字符串
    “hello”
    和空终止符写入内存中的某个位置
  • 名为
    hello
    的变量包含一个值,该值是该内存的地址
inti=0只有一件事发生:

  • 名为
    i
    的变量包含值
    0
将变量传递给函数时,始终会复制它们的值。这被称为传递值,适用于
int
double
等基本类型。对于指针,这很棘手,因为只复制地址;您必须确保该地址的内容仍然有效


简短回答:是的
1
'a'
由于传递值语义而保持不变,而
由于字符串文字分配而保持不变

确保区分指向内存的指针。指针本身就是值,但它是一种特殊的值,包含指向内存的地址

使用
char*hello=“hello”,发生了两件事:

  • 字符串
    “hello”
    和空终止符写入内存中的某个位置
  • 名为
    hello
    的变量包含一个值,该值是该内存的地址
inti=0只有一件事发生:

  • 名为
    i
    的变量包含值
    0
将变量传递给函数时,始终会复制它们的值。这被称为传递值,适用于
int
double
等基本类型。对于指针,这很棘手,因为只复制地址;您必须确保该地址的内容仍然有效


简短回答:是的
1
'a'
由于传递值而保持不变,而
由于字符串文字分配而保持不变,这两种情况称为文字,它们存储在编译后的代码中,在记忆中,当它们必须被使用的时候。在程序运行期间,它们是否保留在内存中取决于它们在程序中声明的位置、大小和编译器的特征,但您通常可以假定它们存储在内存中的某个位置,并且不会消失

请注意,根据编译器和操作系统的不同,可能会无意或有意更改文本的值。许多系统将文本存储在内存的只读区域(CONST段)中,以避免令人讨厌且难以调试的事故

对于适合内存字的文本,如
int
s和
char
s,它们的存储方式无关紧要:在整个代码中重复文本,并让编译器决定如何使其可用。对于较大的文本,如字符串和结构,重复是不好的做法,因此应该保留引用

请注意,如果使用宏(
#define HELLO“HELLO!”
),则由编译器决定要存储多少个文本副本,因为宏扩展正是一个替代项
load r0, 1
#define HELLO "Hello!"
char* hello = HELLO;
char* hello = "Hello!";
const char* hello = "Hello!";
char hello[] = "Hello!";
   char *p
   p = string;
int *func () {
    int localVal = 100;
    int *ptr = localVal;
    return p;
}
int val = func ();
printf ("%d\n", val);