变量
在定义变量的时候,需要指定变量的数据类型。比如定义一个int整型变量:
int a = 1;
除了指定变量的数据类型,还可以对变量进行如下修饰
auto
static
extern
register
auto
auto是C语言中的一个关键字。用于修饰变量。这个修饰符在C11之前很少使用,但这个修饰符是变量定义时的默认修饰符。
如int i;等价于auto int i;
和int i;这种定义形式一样,auto int i;在函数内部定义的话,表示变量是一个局部变量。在函数外部定义的话,表示变量是一个全局变量。
auto修饰符在后面的语言规范中有新的定义。
auto a = "this is a string.";
static
static可以用于修饰变量和函数。static修饰的变量为静态变量,static修饰的函数为静态函数。
变量可以是全局的,也可以是局部的变量。由static修饰的全局变量为静态全局变量,由static修饰的局部变量为静态局部变量。
静态全局变量
静态局部变量
static变量的初始化
var_t* init2()
{
static var_t va = {
.va_a = "test2.",
.va_b = 5,
.va_c = 100};
return &va;
}
var_t* init2()
{
static var_t va;
va.va_a = "test2.";
va.va_b = 5;
va.va_c = 100;
return &va;
}
#include <stdio.h> typedef struct { char* va_a; int va_b; long va_c; } var_t; var_t* init1() { var_t va = { .va_a = "test1.", .va_b = 5, .va_c = 100}; return &va; } var_t* init2() { static var_t va = { .va_a = "test2.", .va_b = 5, .va_c = 100}; return &va; } int main() { var_t *va1 = NULL, *va2 = NULL; va1 = init1(); printf("a:%s, b:%d, c: %ld\n", va1->va_a, va1->va_b, va1->va_c); va2 = init2(); printf("a:%s, b:%d, c: %ld\n", va2->va_a, va2->va_b, va2->va_c); printf("a:%s, b:%d, c: %ld\n", va1->va_a, va1->va_b, va1->va_c); printf("a:%s, b:%d, c: %ld\n", va2->va_a, va2->va_b, va2->va_c); return 0; }
这段程序编译的时候会产生一个告警:
warning: function returns address of local variable
告警产生的地方是init1函数返回的地方:return &va;可以看到这里的va是一个局部变量,将一个局部变量地址返回是不对的,这样做非常危险。
这段程序的特点是init2函数,它和init1的区别是va是一个静态变量,因为定义在函数内部,所以是静态局部变量。
_init2:
pushl%ebp
movl%esp, %ebp
movl$_va.2315, %eax
popl%ebp
ret
.section .rdata,"dr"
LC1:
.ascii "test.\0"
.data
.align 4
_va.2315:
.longLC1
.long5
.long100
静态函数
extern
register
局部变量
全局变量
静态变量
相关推荐
1. 先声明结构体类型,再定义该类型变量: ```c struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct Student student1, student2; ``` 2. 在声明类型的同时...
C程序语言课件:第9章 指针 本章节主要介绍了指针的概念、指针变量的定义和初始化、取地址运算符、间接寻址运算符、按值调用与按地址调用等知识点。 第一节:指针的概念 * 指针是一种数据类型,它存储的是变量的...
第9章主要探讨了数据步变量与变量属性控制,这涉及到如何有效地管理和操作SAS数据集中的变量。以下是对这一章内容的详细解释: 1. **ARRAY语句**:ARRAY语句是SAS中用于定义数组的关键字,它允许用户将一组变量打包...
"C语言课件:第3章 最简单的C程序设计" 本节课程主要讲解了C语言的基本概念和简单的C程序设计。通过实例讲解了顺序程序设计的概念,包括温度单位的转换和计算存款利息等。 3.1 顺序程序设计举例 顺序程序设计是指...
《C语言程序设计:第九章 文件》 在C语言中,文件是程序与外部存储设备交互的重要手段。文件被定义为一组数据的集合,这些数据存储在外设上,如硬盘,甚至包括像键盘这样的设备,当以文件形式处理时被称为设备文件...
第九章“函数(下)”继续讲解函数的高级主题,如函数指针、递归函数、多参数函数以及函数的嵌套调用。函数是代码重用和模块化的重要工具,理解和熟练运用函数能够提高代码的可读性和可维护性。 第十章可能是关于...
第9章主要讲解了C语言中的文件操作,包括文件的基本概念、文件指针类型、文件的打开与关闭、输入输出函数以及使用文件的关键点。 首先,文件是计算机系统中保存数据和程序的实体,通常具有唯一的名字,并存储在外存...
《C语言程序设计:第9章 数组》 在C语言中,数组是一种非常重要的数据结构,它允许程序员存储和操作一组相同类型的元素。数组的基本概念是将具有相同数据类型的元素集合在一起,通过一个统一的数组名来表示,每个...
以下是对"第9章指针"这一主题的详细阐述: 1. 内存地址与变量地址: 在计算机内存中,每个变量都有一个唯一的地址,这个地址是其在内存中的位置,用以区分其他变量。当我们谈论一个变量的地址时,实际上是在谈论它...
本资源对C语言程序设计中的结构体和共用体进行了详细的讲解,涵盖了结构体的定义、结构体变量的定义、结构体型数组、结构体型指针、结构体与函数、共用体等知识点,为读者提供了系统的学习资源。
《信号与系统(第4版)》第9章讲解了系统状态变量分析法,这是现代控制理论中的一个重要概念。状态变量分析法关注系统的内部动态,不仅适用于单输入单输出(SISO)系统,还特别适合多输入多输出(MIMO)系统以及非...
第九章通常会深入讲解C语言中的指针概念,这是C语言的一个核心特性,也是许多编程难题的解决关键。在这一章,学生将学习如何有效地使用指针进行内存操作、数据结构的构建以及函数参数的传递。 1. **指针基础**: 在...
本章主要介绍了C语言的发展历程、特点以及程序的基本结构。C语言起源于1972年至1973年间的美国贝尔实验室,由Ken Thompson和Dennis Ritchie为了开发UNIX操作系统而设计。随着时间的推移,C语言逐渐标准化,K&R合著的...
1. 先定义结构体类型,再定义结构体变量: ```c struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu1, stu2; ``` 2. 定义结构体类型的同时...
1. **指针与地址**:指针是C语言中的一种数据类型,它存储的是变量在内存中的地址。内存是一个线性的存储空间,由多个存储单元组成,每个单元都有一个唯一的地址。通过地址,我们可以找到并访问存储在该地址上的数据...
《C语言讲义:第一章 程序流程控制》 在C语言中,程序流程控制是编程的基础,它决定了程序的执行顺序。本章节主要涵盖了if、switch以及for等基本控制语句,这些语句使得程序员能根据特定条件或循环需求来组织代码。...