(๑╹◡╹)ノ” hi~~
本篇文章主要分析几个c语言容易被误解de知识点,希望能帮到您!谢谢!
目录
:文章内容梗概:
变量范围+数据存储区域介绍
part 1:例题引出
part 2:基础知识剖析及其经典例题
1.变量范围问题:
a.全局变量
①一种经典运用场景,将n维数组传入函数中
②全局变量的改变
b.区域变量
2.c语言数据的存储区域介绍
指针问题:交换数据陷阱+用指针进行的输出陷阱
part 1 交换数据陷阱
part 2 用指针进行输出操作的陷阱
⛳️⛳️总结:
①多种多样的变量范围(到底管哪里?)
②c语言中数据的存储区域到底在哪里?什么时候释放?
③指针之数据交换的多种情况
④指针之数组的输出(字符串数组+数字数组)
以上问题都将有1~2个习题进行介绍,希望对您有帮助!
题目:写出以下代码的运行结果
#include
int a=3;
int f(int x){
static int b=3;
int c=0;
b+=a;
{
int a=x+3;
c+=a;
}
return a+b+c;
}
int main(){
int i;
for(i=1;i<=4;i++)
printf("%d ",f(i));
return 0;
}
答案:
13 17 21 25
参考解析:
第一次进入:
a=3;//依旧是全局变量中的a
b=6;//b+=a;
c=4;//在块区域中被赋值
第二次进入:
a=3;//依旧是全局变量中的a
b=9;//b+=a;static只执行一次
c=5;//在块区域中被赋值
第三次进入:
a=3;//依旧是全局变量中的a
b=12;//b+=a;static只执行一次
c=6;//在块区域中被赋值
part 2:基础知识剖析及其经典例题
1.变量范围问题:
a.全局变量
#include
int a=3; 这种不存在于main函数中的变量称为全局变量,两个例子加深理解
①一种经典运用场景,将n维数组传入函数中
#include
int m; int n; int a[1000][1000];//实际上它就可以一直存在在函数中了,严格来说都不算传进去的 double st(int i,int n) { int max=0,min=100; int sum=0; for(int j=0;j max) max=a[i][j]; if(a[i][j] max) max=every; } printf("%.2lf",max); return 0; } ②全局变量的改变
#include
// 声明全局变量 int globalVar = 10; // 定义一个函数,使用全局变量 void printGlobalVar() { printf("Global variable: %d\n", globalVar); } int main() { // 调用函数,打印全局变量的值 printGlobalVar(); // 修改全局变量的值 globalVar = 20; // 再次调用函数,打印修改后的全局变量的值 printGlobalVar(); return 0; }
b.区域变量
在例子中有一个容易被忽略的点
{ int a=x+3; c+=a; }
这里的花括号只圈定了这一小部分,当括号中的这一部分执行完毕,这当中的所有数据都会被释放
①static(静态变量):
静态变量在内存中存放的位置是栈区(静态存储区)。
特点:只执行一次,下一次再进入函数时,保留它原有的值
②const与全局变量:
const与全局变量在内存中存放的位置是栈区(静态存储区)。
特点:
当一个const变量被定义时,它首先会分配一块内存空间来存储它的值,然后将这个值赋给这个内存空间。这个内存空间的地址不会改变,因此const变量的地址是固定的。
在函数内部定义的const变量,它的存储空间存在于静态存储区,并且它的生命周期与整个程序的运行时间一样长。
需要注意的是,const变量虽然存储在静态存储区,但它仍然有作用域限制。在不同的作用域内,可以定义同名的const变量,它们实际上是不同的变量。
③动态区域:
如malloc申请空间,是动态的,存储在堆区
总结:
存储在栈区的数据有作用区域,该区域结束后,数据会被立马释放
而存储在堆区的数据,需要用free函数进行释放
题目:交换a,b的值
正确示范:
#include
void swap(int *a,int *b){
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
int main(){
int a=3,b=8;
printf("%d %d\n",a,b);
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
通过指针取数的具体值进行交换
易错提醒:
#include
void swap(int *a,int *b){
int *tmp;
tmp=a;
a=b;
b=tmp;
}
int main(){
int a=3,b=8;
printf("%d %d\n",a,b);
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
它的地址换了,但是对它本身没有影响
#include
void swap(int a,int b){
int tmp;
tmp=a;
a=b;
b=tmp;
}
int main(){
int a=3,b=8;
printf("%d %d\n",a,b);
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
这个是形式参数对实际参数没有影响
题目1:输出程序运行结果
#include
void f(int A[ ],int n){
int i,j;
for(i=0,j=n-1; i
答案:
sum=30//注意这里的printf的条件
共有三次循环:
第一次进入(i=0):
a数组情况
case 0 :10 9 8 7 6 5 4 3 2 1case 1: 6 7 8 9 10 5 4 3 2 1
第二次进入(i=1):
a数组情况
case 1: 6 5 10 9 8 7 4 3 2 1
第三次进入(i=2):
a数组情况
case 1: 9 10 5 6 8 7 4 3 2 1
陷阱:
在第二次当中的a+i,i此时等于1,则指针的位置此时要指向7,即A[0]=7
题目2:输出程序运行结果
#include
int main( )
{
const char *st[] = {"Hello", "world", "!"}, **p = st;
p++;
printf("%s-%c\n", *p, **p);
(*p)++;
printf("%s-%c-%c\n", *p, **p, (**p)+1);
return 0;
}
答案:
world-w
orld-o-p
参考图解:
要把区域分开才能得出结果
指针的指向变化有多种表达,应该注意分辨
^(* ̄(oo) ̄)^祝福看到这篇文章的您今天也过得开心!!希望对您有所帮助,感谢您的耐心观看,我们下期见!!┏(^0^)┛,掰掰