C语言中static与sizeof查缺补漏篇

2022-11-13 12:11:05 static 语言 补漏

前言

最近学习遇到了很多小难题,今天这篇博客就来记录一下最近学习所遇到的一些困惑我的地方,以便于复习。

一、关于关键字static

C语言中:

static是用来修饰变量和函数的

  • 修饰局部变量-称为静态局部变量
  • 修饰全局变量-称为静态全局变量
  • 修饰函数-称为静态函数

下面我们用代码来解释一下static在c语言中的应用

1.static修饰局部变量

//第一组代码
#include <stdio.h>
void test()
{
    int i = 0;
    i++;
    printf("%d ", i);//1 1 1 1 1 1 1 1 1 1 
}
int main()
{
 int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}
//第二组代码
#include <stdio.h>
void test()
{
    //static修饰局部变量
    static int i = 0;
    i++;
    printf("%d ", i);//1 2 3 4 5 6 7 8 9 10
}
int main()
{
	int i = 0;
	    for(i=0; i<10; i++)
	   {
	        test();
	   }
	    return 0;
}

代码一:输出为 1 1 1 1 1 1 1 1 1 1

代码二:输出为 1 2 3 4 5 6 7 8 9 10

所以static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。 简单来说就是static把原本在栈区上的局部变量挪到了静态区,即 可以使变量出了作用域之后不销毁。

2.static修饰全局变量

在这里我们需要在一个工程里面开辟2个.c文件,方便我们更清晰的看出static的作用

//代码一
       //add.c
int g_val = 2018;
       //test.c
int main()
{
    printf("%d\n", g_val);//2018
    return 0;
}
//代码2
         //add.c
static int g_val = 2018;
         //test.c
int main()
{
    printf("%d\n", g_val);//会报错
    return 0; }

代码一:输出 2018

代码二:在编译的时候会出现连接性错误

所以我们可以得出结论 :一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

3.static修饰函数

我们也需要在一个工程内开辟2个.c文件方便我们观察

//代码1
     //add.c
int Add(int x, int y)
{
    return x+y;
}
     //test.c
int main()
{
    printf("%d\n", Add(2, 3));//  5
    return 0;
}
//代码2
      //add.c
static int Add(int x, int y)
{
    return c+y; 
}
      //test.c
int main()
{
    printf("%d\n", Add(2, 3));//报错
    return 0;
}

代码一:输出 5

代码二:在编译的时候会出现连接性错误

所以一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

二、sizeof和strlen的区别

我们首先必须知道sizeof是关键字!!

strlen是函数!! 两者有着质的区别

1.sizeof

在c语言中,sizeof在头文件中的类型为unsigned int ,

他的参数可以是指针、数组、类型、对象、函数等等

2.strlen

在c语言中,strlen()是函数,所以在使用它的时候,就有对应的头文件 <string.h> ,他和sizeof在参数上不同的是,strlen的参数只有字符型指针。

二者区别

二者计算指针长度

众所周知字符串数组后面会默认有 ‘\0’ ,下面我们用代码来看看二者的区别

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = { "abcd" };
	printf("%d\n", sizeof(arr));//   5
	printf("%d\n", strlen(arr));//   4
	return 0;
}

sizeof遇到 ‘\0’ 时会将 ‘\0’ 算入

strlen从第一个地址开始遍历,遇到 ‘\0’ (NULL)会立刻返回,但是返回的长度并不包括 ‘\0’

因此 sizeof在字符串数组内返回的长度总是比strlen多一个

下面我们用代码来解释sizeof和stlen的不同

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = { 'a','b','c','d'};
	printf("%d\n", sizeof(arr));//   4
//一个字符在内存中占一个字节,4个字符就占4个字节,所以输出4
	printf("%d\n", strlen(arr));//   15
//因为字符数组并不会默认字符最后有'\0',所以编译器就会一直往后找,直到找到'\0'
//但是此时'\0'是随机的,这取决于编译器,如果在其他编译器内运行 打印的结果可能就是其他大于4的随机数,下面我有贴图片
    char arr1[]={'a','b','c','d','\0'};	
    printf("%d\n", strlen(arr1));//  4
	return 0;
}

三、关于if()内部>与<的正确使用

首先我们来看一道题目

我相信大家刚开始看到这道题目的时候一定和我一样不理解,字符 ‘c’ 不是比字符 ‘m’ 小吗,这样打印出来的不应该是no吗,可是为什么打印出来的是yes呢?

我们是这样解释的:在c语言中,编译器都是从左到右依次判断,因此编译器会先判断字符 ‘c’ 是否比字符 ‘m’ 大,显而易见是假的,因此前面就变成了0,表示假,然后就会判断0是否比字符 ==‘z’==小,显而易见 0比 ==‘z‘==小,因此if语句里面的就是真的,所以我们会打印出 yes。

但是怎样才会打印出我们想要的结果呢?看下面的代码

当我们用 ==&&==这个符号连接时,if语句里面的意思就是 字符’c‘<‘m’ 且字符’c‘>'m’是打印yes,这就是我们想要的结果了。

到此这篇关于C语言中static与sizeof查缺补漏篇的文章就介绍到这了,更多相关C语言static与sizeof内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章