【c语言】QWQ 总是被萌新误解的那些知识点们~

(๑╹◡╹)ノ”  hi~~

本篇文章主要分析几个c语言容易被误解de知识点,希望能帮到您!谢谢!

目录

👻👻:文章内容梗概:

😀😀变量范围+数据存储区域介绍

part 1:例题引出🌿🌿

part 2:基础知识剖析及其经典例题🌿🌿

1.变量范围问题:🥗🥗

a.全局变量

①🐴一种经典运用场景,将n维数组传入函数中

②🐴全局变量的改变

b.区域变量

2.c语言数据的存储区域介绍🥗🥗

😀😀指针问题:交换数据陷阱+用指针进行的输出陷阱

part 1 交换数据陷阱

part 2 用指针进行输出操作的陷阱

⛳️⛳️总结: 


👻👻:文章内容梗概:

①🏌多种多样的变量范围(到底管哪里?)

②🏌c语言中数据的存储区域到底在哪里?什么时候释放?

③🏌指针之数据交换的多种情况

④🏌指针之数组的输出(字符串数组+数字数组)

以上问题都将有1~2个习题进行介绍,希望对您有帮助!

😀😀变量范围+数据存储区域介绍

part 1:例题引出🌿🌿

题目:写出以下代码的运行结果

#include <stdio.h>
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 <stdio.h>
int a=3;

这种不存在于main函数中的变量称为全局变量,两个例子加深理解

①🐴一种经典运用场景,将n维数组传入函数中
#include <stdio.h>
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<n;j++)
		{
			if(a[i][j]>max)
			max=a[i][j];
			if(a[i][j]<min)
			min=a[i][j];
			sum+=a[i][j];
		}
		sum=sum-(max+min);
return sum/(double)(n-2);
}
int main()
{
	double max=0;double every;
	scanf("%d%d",&m,&n);
	for(int i=0;i<m;i++)
	for(int j=0;j<n;j++)
	scanf("%d",&a[i][j]);
	for(int i=0;i<m;i++)
	{	
	every=st(i,n);
	if(every>max)
		max=every;
	}
	printf("%.2lf",max);
	return 0;
}
②🐴全局变量的改变
#include <stdio.h>

// 声明全局变量
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;
	}

 这里的花括号只圈定了这一小部分,当括号中的这一部分执行完毕,这当中的所有数据都会被释放

2.c语言数据的存储区域介绍🥗🥗

static(静态变量)

静态变量在内存中存放的位置是栈区(静态存储区)。

特点:只执行一次,下一次再进入函数时,保留它原有的值


const与全局变量

const与全局变量在内存中存放的位置是栈区(静态存储区)。

特点:

当一个const变量被定义时,它首先会分配一块内存空间来存储它的值,然后将这个值赋给这个内存空间。这个内存空间的地址不会改变,因此const变量的地址是固定的。

在函数内部定义的const变量,它的存储空间存在于静态存储区,并且它的生命周期与整个程序的运行时间一样长。

需要注意的是,const变量虽然存储在静态存储区,但它仍然有作用域限制。在不同的作用域内,可以定义同名的const变量,它们实际上是不同的变量。


动态区域:

如malloc申请空间,是动态的,存储在堆区


🔆🔆总结:

存储在栈区的数据有作用区域,该区域结束后,数据会被立马释放

而存储在堆区的数据,需要用free函数进行释放

😀😀指针问题:交换数据陷阱+用指针进行的输出陷阱

part 1 交换数据陷阱

题目:交换a,b的值

正确示范

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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;
}

这个是形式参数对实际参数没有影响

part 2 用指针进行输出操作的陷阱

题目1:输出程序运行结果

#include <stdio.h>
	void f(int A[ ],int n){
		int i,j;
		for(i=0,j=n-1; i<j; i++,j--){
			int t;
			t=A[i];A[i]=A[j];A[j]=t;
		}
	} 
	int main(){
		int a[]={1,2,3,4,5,6,7,8,9,10};
		int i;
		for(i=0;i<3;i++){
			switch(i){
				case 0:f(a,10);
				case 1:f(a+i,5);break;
				case 2:f(a,4);
			}
		}
		printf("sum=%d",a[0]+a[1]+a[2]+a[3]);
		return 0;
	}

答案: 

sum=30//注意这里的printf的条件

共有三次循环: 

第一次进入(i=0):

a数组情况
case 0 :10 9 8 7 6 5 4 3 2 1

case 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 <stdio.h>
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^)┛,掰掰

 

 

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值