绍兴市越城区建设局网站,那个网站可以做链接,做网络销售感觉自己是骗子,视频分享网站模板return 关键字 不知道我们大家是否有一个疑惑#xff1a;我们下载一个大型游戏软件#xff08;王者荣耀#xff09;#xff0c;都要花几个小时去下载#xff0c;但是一旦我们游戏连输#xff0c;想要删除这个软件的时候#xff0c;它仅仅只需要十几秒#xff0c;这是为…return 关键字 不知道我们大家是否有一个疑惑我们下载一个大型游戏软件王者荣耀都要花几个小时去下载但是一旦我们游戏连输想要删除这个软件的时候它仅仅只需要十几秒这是为什么呢?今天我们就来带着这个疑惑一起来解决这个问题。 计算机中释放空间是否真的要将我们的数据全部清零? 在计算机中释放空间并不一定要将其中的数据全部清零。释放空间也就是删除文件计算机并不会立即清零或删除文件的内容。实际上计算机操作系统通常只是将这些文件对应的磁盘空间标记为可重用然后在需要存储新的数据时将其覆盖。因此即使删除了文件它的内容可能仍然存在于硬盘或其他存储设备中只要未被覆盖就可以恢复。 总结当你删除一个文件时计算机只需要简单地将文件所在的存储空间标记为可用不需要进行实际的数据传输因此删除数据的速度较快。 下面来看一段代码
#include stdio.h
char* show()
{char str[] hello world;return str;
}
int main()
{char* s show();printf(%s\n, s);return 0;
}这段代码主要涉及到两个问题局部变量的生命周期和内存安全性。 首先我们来看局部变量的生命周期。在函数 show() 中变量 str 是定义在函数体内的局部变量。局部变量的生命周期只在函数体内一旦函数执行完毕就会被销毁。因此在 return str; 语句执行完毕之后变量 str 所占用的内存空间就被释放了。 接着我们看内存安全性的问题。在 show() 函数中我们将作为返回值的变量 str 的地址返回给了调用者。由于变量 str 所在的内存空间已经被释放因此返回的指针 s 指向的内存空间已经不再被保证安全。在 main() 函数中我们调用了 printf() 函数输出了 s 所指向的内存空间中的字符串由于该内存空间可能已经被其他程序或者系统使用因此会导致未知的错误。这一点也是常说的“野指针”问题。 我们来详细了解一下其中的释放过程 总结本代码中return语句不可返回指向栈内存的指针因为该内存在函数体结束时被自动销毁。 这里很奇怪呀我们刚刚不是说函数调用完后会释放栈帧里面的数据x经过printf函数应该就会被覆盖但是我们这里为什么还能打印它呢 - 这里就要介绍一下return关键字 return 语句是 C 语言中的一个关键字用于结束当前函数的执行并返回一个值或不返回值。在大多数情况下return 语句用于向调用者返回一个函数执行结果。 return 语句有多种不同的用法和语法结构其中最常见的用法是 c return expression; 其中 expression 可以是一个常量、变量、表达式或者其他函数调用的返回值这个值会成为函数的返回值被返回给调用者。 我们上面的代码返回的是x的值函数栈帧内return关键字将x的值保存在寄存器中通过寄存器将x的值带回给main函数中的y。如果是x的地址它也会被返回只不过不能打印其中的值。编译器会提出警告。 const 关键字 const是C语言中的一个关键字它的作用是修饰变量表示该变量的值是不可直接修改的。这意味着使用const关键字声明的变量在程序运行期间一旦赋值就不能再被修改。const关键字可以用于修饰基本数据类型、结构体、指针等类型的变量。 使用const关键字有以下好处 1. 程序的可读性更好使用const关键字可以明确告诉其他程序员该变量是一个常量不应该被修改。 2. 程序更加安全使用const关键字可以避免在程序中意外地修改一个应该是常量的变量提高了程序的健壮性。 3. 编译器可以利用const关键字优化程序例如在一些情况下编译器可以将常量直接嵌入到代码中提高了程序的执行效率。 const 修饰的只读变量 - - - 不可直接被修改 不可以直接被修改但可以被间接修改 - 通过地址进行修改 结论const修饰的变量并非是真的不可被修改的常量。
const修饰的变量可以作为数组定义的一部分吗 const int n 100; int arr[n]; 这里可以看我写的另一篇文章里面有介绍到。
总结在vs2013(标准C)下直接报错了但是在gcc(GNU扩展)下可以。但我们一切向标准看齐不可以。
const只能在定义的时候直接初始化不能二次赋值。为什么 const关键字的作用是告诉编译器该变量是一个常量不应该被修改。因此使用const关键字声明的变量在程序运行期间一旦赋值就不能再被修改。 为了让编译器能够实现这个目标const关键字在编译时会对该变量进行一些优化使得该变量的值在程序运行期间不可修改。如果允许在程序运行期间对该变量进行二次赋值那么编译器就无法保障该变量的值不会被修改这与const关键字的含义相违背。 因此const只能在定义的时候直接初始化不能二次赋值的原因是为了保证程序的健壮性和安全性。如果确实需要在程序运行期间动态地修改一个变量的值应该使用普通的变量而不是使用const修饰的变量。 const修饰指针
先来介绍一下左值和右值的概念 在计算机编程中左值lvalue和右值rvalue是表达式的两种类型。 左值表示的是被赋值的对象可以出现在“”的左边也可以在表达式的任何一个操作数中。左值可以出现在多个操作中并且能够被改变。 右值表示的是一个可以赋值给左值的值右值可以出现在表达式的任何一个操作数中但是不能被改变。右值通常是一个临时值用于计算表达式并且当表达式执行完毕后其值就会被丢弃。 指针变量也存在左值和右值。 在C语言中指针是一种特殊的变量它存储的是一个内存地址可以用来访问那个地址中存储的数据。在定义指针变量时我们可以使用const关键字来决定指针和指针指向的数据是否可以被修改。 1. const int* p; 这里的const作用于指针指向的数据表示p指向的数据是不可修改的。也就是说我们可以通过p指针读取这个常量数据但是不能通过p指针修改这个数据。比如p本身可以被修改比如p但是p指向的int类型变量是不可修改的比如*p10是不合法的。 2. int const* p; 这个定义和上面的定义是等价的const关键字位置不同但含义相同。 3. int* const p; 这里的const作用于指针本身表示p指针本身是不可修改的。也就是说我们不能通过改变p指针的值来让它指向其他的地址但是可以通过p指针修改这个地址中存储的数据。比如p本身不可以被修改比如p是不合法的但是p指向的int类型变量是可以被修改的比如*p10是合法的。 4. const int* const p; 这个定义中有两个const关键字一个作用于指针本身一个作用于指针指向的数据。表示p指针本身和p指向的数据都是不可修改的也就是说p指针只能指向某一块地址而且这块地址中存储的数据也不能被修改。比如p本身不可以被修改比如p是不合法的并且p指向的int类型变量也是不可修改的比如*p10是不合法的。 const int* p1 a; int* q1 p1; 这里将const int*类型的指针p1赋值给了int*类型的指针q1这样做是不安全的。因为p1指向的是一个不可修改的常量int类型变量如果通过q1指针去修改p1所指向的变量就会引发未定义行为。正确的做法是将指针类型强制转换为非const类型即 int* q1 (int*)p1; int* const p2 b; int* q2 p2; 这里将int* const类型的指针p2赋值给int*类型的指针q2这样做是安全的。因为p2指向的是一个可以修改的int类型变量同时p2本身也是不可修改的。而且将const类型的指针赋值给非const类型的指针也是安全的。所以这段代码是没有问题的不需要做改动。 const修饰函数的参数 在C语言中我们也可以使用const关键字来修饰函数的参数这表示函数不会修改被修饰的参数的值。 函数中的参数可以分为形参和实参形参是函数中定义的变量实参是函数调用时传递给函数的值。使用const关键字修饰形参时表示函数中不能修改这个形参的值。如果函数试图修改被const修饰的形参编译器会报错。 下面是一个使用const修饰函数参数的例子 void print_array(const int* arr, int n)
{for (int i 0; i n; i) {printf(%d , arr[i]);}printf(\n);
}int main(void)
{int arr[] { 1, 2, 3, 4, 5 };print_array(arr, 5);return 0;
} 在这个例子中print_array函数的第一个参数是const int*类型表示这个指针指向的是一段不可修改的内存函数中不能修改这段内存对应的值。第二个参数是普通的int类型表示数组的长度。 在函数内部我们使用了一个for循环来遍历数组并使用printf函数打印数组中的每个元素。 因为我们将第一个参数声明为const int*类型所以在函数中不能修改这个指针所指向的值。如果函数尝试修改这个指针所指向的值编译器会报错。 这有助于保护数组中的值不被意外修改提高程序的健壮性。 函数在传参的时候有没有形成临时变量 在C语言中函数参数传递采用的是值传递或者地址传递方式。当我们调用函数时会将实参的值复制一份然后传递给函数而函数中定义的形参则是一个新的变量。这个过程中确实会生成一个临时变量来存储实参的值。 拜拜