关于【static】【sizeof】等等 我到底了解了多少------一篇记录我困惑地方的随笔

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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


一、关于关键字static

在C语言中:
static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

下面我们用代码来解释一下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多一个

3、下面我们用代码来解释sizeofstlen的不同

#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,这就是我们想要的结果了。

总结

以上这些就是我在最近学习中遇到的不解,如果还有错误,希望大家可以私信我并指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值