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);