文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

前言

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

一、关于关键字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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯