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

目录
  • 前言
  • 一、关于关键字static
    • 1.static修饰局部变量
    • 2.static修饰全局变量
    • 3.static修饰函数
  • 二、sizeof和strlen的区别
    • 1.sizeof
    • 2.strlen
    • 二者区别
  • 三、关于if()内部>与<的正确使用

前言

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

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

(0)

相关推荐

  • 深入了解C语言中的动态内存分配

    目录 什么是动态内存分配 如何进行动态内存分配 首先我要介绍两个函数 malloc 和 free 第二个开辟空间的动态内存分配的函数 calloc 大小修改函数realloc 今天我们来学习一下C语言中的动态内存分配 开始学习吧 什么是动态内存分配 我们目前已经知道的内存开辟的方式有: int val = 20;//在栈上开辟四个字节. char arr[10] = { 0 };//在栈上开辟十个字节的连续空间 但是上述空间的开辟方式有两个特点: 1.空间开辟的大小是固定的 2.数组在申明的时候

  • C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    目录 常用的字符串处理函数(标准库里面的) sizeof 求字节运算符 动态内存分配函数 main的参数问题 常用的字符串处理函数(标准库里面的) strlen : 用来求一个字符串的长度 #include <string.h>                     size_t strlen(const char *s);                @s : 指向要计算的那个字符串的首地址                     “const char *” : 表示在函数调用过程中,

  • C语言深入讲解动态内存分配函数的使用

    目录 一.malloc 二.free(用于释放动态开辟的空间) 三.calloc 四.realloc 五.常见的动态内存分配错误 六.柔性数组 局部变量和函数的形参向栈区申请空间 全局变量和static静态变量向静态区申请空间 动态内存分配向堆区申请空间(位于<stdlib.h>或<cstdlib>头文件) 一.malloc void* malloc (size_t size); 分配内存块 分配一个连续可用的字节内存块,返回指向该内存块开头的指针. 新分配的内存块的内容未初始化,

  • C语言深入探究sizeof与整型数据存储及数据类型取值范围

    目录 1.关键字sizeof 2.整型数据存储深入 3.数据类型取值范围深入 1.关键字sizeof sizeof 与 strlen 是我们日常打代码时经常使用到的两个“工具”.前者是求变量或者类型的大小(单位为字节),后者是求某一字符串的长度.我们很容易产生这样一个误解,即把 sizeof 和 strlen 归为函数一类.事实上 sizeof 并不是一个函数,它是一个操作符.关键字.我们通过一段代码证明它不是函数: #include <stdio.h> int main() { int n

  • C语言main函数的三种形式实例详解

    在C语言中,main()函数有三种形式. 1.无参数 #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } 2.有两个参数 习惯上第一个参数是整型argc,保存了外部调用命令的参数个数,第二个参数是指针数组或二级指针argv,以字符串形式保存了与argc对应的参数,如下例子: #include <stdio.h> int main(int argc, char* arg

  • c语言中main函数用法及知识点总结

    1.main函数是C程序的入口函数,即程序的执行从main函数开始,其他函数的调动也直接或间接地在main函数中调用. 2.main函数的返回值用于解释程序的退出状态. 若返回0,则表示程序正常退出.返回其他数字的含义由系统决定.通常返回非零代表程序异常退出. 实例 #include <stdio.h> #include <string.h> int main(int argc, char **argv) { int i = 0; printf("The program

  • C语言中main函数与命令行参数详细讲解

    目录 一.main 函数的概念 二.main 函数的本质 命令行 三.main 函数的参数 四.main 函数一定是程序执行的第一个函数吗 五.小结 一.main 函数的概念 C语言中 main 函数称之为主函数 一个C程序是从 main 函数开始执行的 二.main 函数的本质 main 函数是操作系统调用的函数 操作系统总是将 main 函数作为应用程序的开始 操作系统将 main 函数的返回值作为程序的退出状态 下面看一下 main 函数的返回值: A.c: #include <stdio

  • C语言详细讲解常用字符串处理函数

    目录 一.strlen() 1. 函数原型: 2. 手动实现: 二.strcat() 1. 函数原型: 2. 手动实现: 三.strcpy() 1. 函数原型: 2. 手动实现: 四.strcmp() 1. 函数原型: 2. 手动实现: 五.memset() 1. 函数原型: 2. 手动实现: 一.strlen() 1. 函数原型: size_t strlen(const char *str) 参数str: 要计算的字符串的长度返回值: 返回字符串 str 的长度,直到遇到结束字符'\0',但不

  • 从头学习C语言之字符串处理函数

    目录 字符串处理函数: 存放和使用字符串: 获取字符串长度:strlen 示例: 拷贝字符串:strcpy和strncpy 示例: strncpy: 示例: 连接字符串:strcat和strncat 示例: 比较字符串:strcmp和ctrncmp strncmp和strcmp和区别: 示例: 总结 字符串处理函数: 存放和使用字符串: 字符串常量:“fishc”,“小甲鱼”,“鱼C工作室”字符数组: 获取字符串长度:strlen 用法:strlen(str) 注意: 这个函数获得的是长度(不带

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

    目录 前言 一.关于关键字static 1.static修饰局部变量 2.static修饰全局变量 3.static修饰函数 二.sizeof和strlen的区别 1.sizeof 2.strlen 二者区别 三.关于if()内部>与<的正确使用 前言 最近学习遇到了很多小难题,今天这篇博客就来记录一下最近学习所遇到的一些困惑我的地方,以便于复习. 一.关于关键字static 在C语言中: static是用来修饰变量和函数的 修饰局部变量-称为静态局部变量 修饰全局变量-称为静态全局变量 修饰

  • C语言中static的作用及C语言中使用静态函数有何好处

    想了解Java中static关键字的作用和用法详细介绍,请点击此处了解详情. 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条,分别是: 一是隐藏功能,对于static修饰的函数和全局变量而言 二是保持持久性功能,对于static修饰的局部变量而言. 三是因为存放在静态区,全局和局部的static修饰的变量,都默认初始化为0 下面我逐一给大家介绍: (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有

  • c语言中static修饰函数的方法及代码

    1.静态函数只能在声明它的文件中可见,其他文件不能引用该函数. 2.不同的文件可以使用相同名字的静态函数,互不影响. 3.使用static声明的函数不能被另一个文件引用. 实例 /* file1.c */ #include <stdio.h> static void fun(void) { printf("hello from fun.\n"); } int main(void) { fun(); fun1(); return 0; } /* file2.c */ #inc

  • C语言中static的使用介绍

    目录 1.static 可以修饰局部变量 2. static 可以修饰全局变量 3.static 可以修饰函数 总结 1.static 可以修饰局部变量 首先让我看看这段代码 #include<stdio.h> void test() { int a = 1; a = a + 1; printf("%d", a); } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; } 你认为输出的结

  • C语言中static和auto用法详解

    目录 static的第一种用法:定义为静态变量 static的第二种用法:有理说不清,直接代码见真知 auto的用法:直接代码见真知 总结 static的第一种用法:定义为静态变量 何为静态变量?存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.就是只进行一次初始化.不理解?看代码! 代码见真知: #include<stdio.h> int main() { void fun(); //定义一个空函数 for(int i=0;i<3;i++) { fun();

  • C语言中static的使用方法实例详解

    目录 前言 一.static修饰变量 1.修饰局部变量 2.修饰全局变量 二.static修饰函数 补充:static的好处是什么? 总结 前言 static关键字不仅可以用来修饰变量,还可以用来修饰函数.在使用static关键字修饰变量时,我们称此变量为静态变量.静态变量的存储方式与全局变量一样,都是静态存储方式.静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量. 一.static修饰变量 1.修饰局部变量 先看段代码: #include <stdio.h> void t

  • c语言中static的用法详细示例分析

    static在c里面可以用来修饰变量,也可以用来修饰函数.先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混. 复制代码 代码如下: int a ;int main(){    int b ;     int c* = (int *)malloc(sizeof(int));} a是全局变量,b是栈变量,c是堆变量.static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量.有的程序是由好多.c文件构成.彼此可以互相引用变量,

  • c语言中static和extern的用法详细解析

    一,static和extern:大工程下我们会碰到很多源文档. 文档a.c 复制代码 代码如下: static int i; //只在a文档中用int j;    //在工程里用static void init()         //只在a文档中用{}void callme()          //在工程中用{   static int sum;} 上面的全局i变量和init()函数只能用在a.c文档中,全局变量sum的作用域只在callme里.变量j和函数callme()的全局限扩充到整个

  • C语言中sizeof函数的基本使用总结

    前言 C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么.我以前也有用错的时候,现在写一写,也算是提醒一下自己吧. sizeof是什么 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等,sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.这个操作数不好理解对吧?后面慢慢看就明白了.sizeof的返回值是size_t,在64位机器下,被定义为long unsigned int. sizeof函数的结果:

  • C语言中sizeof()与strlen()的区别详解

    前言 sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别: sizeof() 1. sizeof()[操作数所占空间的字节数大小]是一种c中的基本运算符. 可以以类型.指针.数组和函数等作为参数. 头文件类型为unsigned int. 运算值在编译的时候就出结果,所以可以用来定义数组维数. char a[5]="123"; int b=sizeof(a);//b=5 int c=strlen(a);//c=3 sizeof()是一种单目操作符,是用来计算你所使用

随机推荐