【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 
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;jmax)
			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;
	}

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

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

static(静态变量)

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

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


const与全局变量

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

特点:

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

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

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


动态区域:

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


总结:

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

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

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

part 1 交换数据陷阱

题目:交换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;
}

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

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

题目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 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 
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

参考图解: 

【c语言】QWQ 总是被萌新误解的那些知识点们~_第1张图片

⛳️⛳️总结: 

要把区域分开才能得出结果

指针的指向变化有多种表达,应该注意分辨

^(* ̄(oo) ̄)^祝福看到这篇文章的您今天也过得开心!!希望对您有所帮助,感谢您的耐心观看,我们下期见!!┏(^0^)┛,掰掰

 

 

你可能感兴趣的:(c语言,开发语言)