带着疑问学C语言-C语言常用变量

news2024/9/20 8:09:16

目录

目录

一、声明变量和定义变量的区别是什么?

二、什么常量,如何区分常量和变量?

三、各数据类型所占的内存是多少?

四、字符与字符串的差别有哪些?

五、为什么会发生数据溢出,如何避免数据溢出?

六、全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?

七、全局变量和局部变量的存储方式有什么区别?

八、整型常量的存储形式是怎样的?

九、static关键字有什么作用?

十、const关键字有什么作用?



一、声明变量和定义变量的区别是什么?

什么是定义?

在C语言中,使用变量前必须先定义变量。就是编译器创建了一个变量,为这个变量分配一块内存并命名(变量名)。

例如:

int a;
int b=1;

这条语句说明a是一个整型变量,编译器为其分配了一块大小为int型数据所占的内存空间。a没有被赋值,它的默认值为0,定义时也可以为其赋值进行初始化,如变量b。

注意:不应该在头文件中定义变量,因为一个头文件可能会被一个程序的许多源文件所包含。

什么是声明?

声明,就是告诉编译器变量的类型,编译器并不为其分配内存,此变量已经定义过,故声明可以多次进行。例如声明外部变量a。

extern int a;

这条代码说明a是一个外部整型变量,并且它的存储空间是在程序的其他区域分配的。extern置于变量前,以标记变量的定义在别的区域,下面的代码用到的变量a是在外部区域定义的,不是本部区域定义的,提示编译器遇到变量a在其他区域中寻找其定义。

区别

1、定义创建了变量,并为其分配内存,声明没有分配内存;

2、一个变量在一定的区域中只能被定义一次,却可以被多次声明。

二、什么常量,如何区分常量和变量?

常量及其值在程序运行的过程中是不可改变的,变量是在程序运行期间其值是可以进行改变的值,如:int a;char b; a是整型变量,b是字符型变量。

区别

1、常量不能被修改,其存放的位置未知;变量随时可以被修改,且有特定的存储空间;

2、变量有变量名;常量只有符号没有名字。

三、各数据类型所占的内存是多少?

这三种类型的数据所占的内存是由机器的机器字长决定的。在16位机器中,long型数据所占的字节是4,int型数据所占的字节是2,short型数据所占的字节是2。而在32位机上,long所占的字节是4,int型数据所占字节是4,short型数据所占字节是2。

注意

无论在什么环境下,都有:short型数据所占内存不得长于int型数据,int型数据所占内存不得长于long型数据。

四、字符与字符串的差别有哪些?

‘a’是字符常量,“a”为字符串常量。两者之间的差别主要有以下3点:

1、定界符的使用不同。字符常量使用的是单引号,字符串常量使用的是双引号

char b;
b='a'; //正确的赋值方式
b="c"; //错误的赋值方式
b="hello" //错误的赋值方式,会造成字符丢失。

2、长度不同:字符常量只能有一个字符,长度为1。而字符串常量的长度却可以为0,即使字符串常量中常量的字符数量只有一个,但是其长度却不是1,而是2,因为系统会自动在字符串常量尾部加上一个转义字符'\0'作为结束标记。

3、存储的方式不同:在字符常量中存储的是字符的ASCII码值,在字符串常量中不仅要存储有效的字符,还要存储结尾处的结束标记'\0'。

五、为什么会发生数据溢出,如何避免数据溢出?

以Toubo C为例:

#include <stdio.h>
int main()
{
    int i,res; //声明变量
    i=32767;  //定义变量
    res=i+1;  //变量值+1
    printf("%d,%d",i,res);  //输出结果
}

一个int型变量的最大允许值为32767,如果在加1的话则溢出,程序不会报错,程序运行的结果为-32768。如果发生溢出,运行时不会报错,而是将结果从“头”开始计算,即是上面的运行结果。这与编程者的意愿不同。解决方法是将数据定义为long类型,在输出的时候使用“%ld”即可。

注意:

long型数据可以得到大范围的整数,但同时会降低运算速度,因此除非不得已,否则不要随便使用long型。

六、全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?

全局变量可以定义在可被多个.c文件包含的头文件中,在不同的.c文件中以static形式声明同名全局变量,前提是其中只能有一个.c文件中对此变量赋初值,此时连接才不会出错。

七、全局变量和局部变量的存储方式有什么区别?

全局变量储存在静态数据库中,局部变量存储在堆栈中。全局变量在程序开始执行时分配存储区,程序执行完毕释放。在程序执行过程中全局变量始终占据固定的存储单元;局部变量是动态分配存储空间的,在调用变量所在函数时,系统会给函数的局部变量分配存储空间,在函数调用结束时自动释放这些存储空间。

八、整型常量的存储形式是怎样的?

整型数据在内存中以二进制的形式存放,数值是以补码表示的。一个正数的补码和其原码的形式相同,一个负数的补码是将概述绝对值得二进制形式,按位取反再加1。

 

 整型常量在内存中以二进制形式存储的有两种数据:有符号和无符号。上面介绍的是有符号的数据在内存中的存储形式,无符号的整型常量是整数或者0,所以最高位不用来存放数据的符号,而是用来存放数据本身。

九、static关键字有什么作用?

static关键字的主要作用如下:

1、函数体内,static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。

2、在模块内的ststic全局变量可以被模块内所有的函数访问,但不能被模块外的其他函数访问。

3、在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。

static int i;
void func1(void)
{
    i=0;
    i++;
    printf("i=%d",i);
}
void func2(void)
{
    static int j=0;
    j++;
    printf("j=%d",j);
}
int main()
{
    int n;
    for(n=0;n<10;n++)
    {
        func1();
        func2();
    }
    return 0;
}

上面程序的运行结果为:

注意:

静态局部变量只能在变量被定义的文件中使用,其他文件即使用extern声明也没法使用它。准确的说,作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它,想要使用就得在前面再加extern。

十、const关键字有什么作用?

const关键字的作用如下:

1、欲阻止一个变量被改变,可以使用const,在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了。

2、对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const。

3、在一个函数声明中,const可以修饰形参,表示他是一个输入参数,在函数内部不能改变其值。

#include<stdio.h>
int main()
{
    const int a=5;
    int b=6;
    int c=7;
    const int* m=&b;
    int *const n=&b;
    const int* const k=&b;
    a=2;
    m=&c;
    *m=1;
    n=&c;
    *n=1;
    *k=1;
}

解释:

1、由于变量a被const修饰,所以他不可改变,这样会出现编译错误。如在开始没有对a进行初始化,系统将为a赋一个随机数,在后面也不可以进行赋值。

2、m定义为const int* 类型,const在int*的左侧,他是用修饰指针所指向的变量,也就是指针指向为常量,m=&c是被允许的,因为这样并没有修改指针m所指的内容,而是修改指针本身m。但*m=1修改的却是指针m所指的内容,这将不被允许,编译出错。

3、n定义为int* const类型,const在int*的右侧,他修饰指针本身,即修饰常量。因此*n=1是被允许的,n=&c修改指针n不被允许。

4、k定义为const int* const类型,int*在左右两侧都有一个const,他表示既不能修改指针,也不能修改指针内容,故k=&c,*k=1都会编译出错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合juit和springboot整合mybatis和springboot整合ssm

springboot整合juit 先看一眼包路径&#xff0c;发现main程序的路径和测试类的路径是一样的 启用新注解&#xff1a;SpringBootTest代替了之前sm整合juit时的 RunWith(SpringJUnit4ClassRunner.class) //spring配置类 ContextConfiguration(classes config.class)新的如此…

数字北京城,航行在联通2000M的“大运河”

前故宫博物院院长单霁翔&#xff0c;在《大运河漂来紫禁城》一书中提到过&#xff0c;紫禁城里的石材、木材&#xff0c;甚至每一块砖&#xff0c;都是通过大运河&#xff0c;跋山涉水来到北京的。某种程度上说&#xff0c;北京城的繁荣与这条纵跨南北的“中华大动脉”密不可分…

OpenGL入门教程之 变换

引言 这是一个闪耀的时刻&#xff0c;因为我们即将能生产出令人惊叹的3D效果&#xff01; 变换 向量和矩阵变换包括太多内容&#xff0c;但由于学过线性代数和GAMES101&#xff0c;因此不在此做过多阐述。仅阐述包括代码的GLM内容。 GLM的使用 &#xff08;1&#xff09;GLM…

拓扑排序例题 P4017 最大食物链计数

拓扑排序例题 P4017 最大食物链计数 题目链接&#xff1a;P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 最大食物链计数 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是重…

陆奇博士4月23日深圳奇绩创坛分享会PPT及核心观点:新范式、新时代、新机遇(附PPT下载链接)...

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 【限时免费】ChatGPT4体验&#xff0c;无需翻墙直接用 ChatGPT调研报告&#xff08;仅供内部参考&#xff09; ChatGPT的发展历程、原理、技术架构…

记录-使用双token实现无感刷新,前后端详细代码

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 近期写的一个项目使用双token实现无感刷新。最后做了一些总结&#xff0c;本文详细介绍了实现流程&#xff0c;前后端详细代码。前端使用了Vue3Vite&#xff0c;主要是axios封装&#xff0c;服务…

Unity之OpenXR+XR Interaction Toolkit接入Pico VR一体机

一.前言 Pico VR 一体机是目前国内比较流行的VR设备之一&#xff0c;PICO成立于2015年3月&#xff0c;于2021年9月并入字节跳动。最新推出的Pico4一体机售价只有2400左右&#xff0c;这让很多家庭都入手了Pico设备&#xff0c;VR一体机的功能包括&#xff1a;VR全景视频&#…

学成在线笔记+踩坑(8)——课程预览、提交审核,Freemarker模板引擎

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题_java黑马笔记 目录 1 模块需求分析 1.1 模块介绍 1.2 业务流程 1.2.1 课程预览 1.2.2 课程审核 1.2.3 课程发布 2 课程预览 2.1 需求分析…

深度学习 - 43.SeNET、Bilinear Interaction 实现特征交叉 By Keras

目录 一.引言 二.SENET Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Function 2.4 Test Main Function 2.5 完整代码 三.BiLinear Intercation Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Functi…

〖ChatGPT实践指南 - 零基础扫盲篇③〗- 开始使用 ChatGPT 并访问 OpenAI 获取 API Keys

文章目录 ⭐ 访问 ChatGPT 并登录⭐ OpenAI API keys 简介⭐ 获取 OpenAI 的 API keys 文件 请注意&#xff0c;该章节介绍的是如何使用 ChatGPT &#xff0c;并通过登录ChatGPT后访问 OpenAI 获取 API Keys&#xff0c;并不涉及如何科学的注册 ChatGPT。 ⭐ 访问 ChatGPT 并登…

D. Mysterious Present(Codeforces Beta Round 4 (Div. 2 Only))

https://codeforces.com/contest/4/problem/D 题目大意 给定 n n n 个信封的长和宽&#xff0c;以及一张卡片的长和宽&#xff0c;要求选出最多的信封&#xff0c;并且这些信封的长和宽都比前面的信封要大&#xff0c;并且最小的信封能够装下这张卡片。输出这些信封的数量和…

VS项目常规属性

常规属性页&#xff08;项目&#xff09; 常规 目标平台 指定运行项目的平台。例如&#xff0c;Windows&#xff0c;Android或iOS。 在此处&#xff0c;值 Windows 10 表示项目面向通用 Windows 平台。此属性是在创建项目时设置的只读字段。 目标平台版本 指定用于生成项目…

基于html+css的图展示41

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

智慧园区数字化转型下的移动App发展

随着智慧城市的建设和智慧园区的崛起&#xff0c;智慧园区数字一体化建设成为园区发展的重心&#xff0c;当然数字转型离不开移动应用的整合服务。 在过去的几年中&#xff0c;智慧园区移动应用已经发展成为园区管理和服务的重要手段之一&#xff0c;为企业和员工提供了更加便…

OkHttp3源码解析 - 连接机制和缓存机制

系列文章目录 第一章 OkHttp3源码解析 - 请求流程 第二章 OkHttp3源码解析 - 拦截器 第三章 OkHttp3源码解析 - 连接机制和缓存机制 文章目录 系列文章目录前言一、连接机制1.1 创建连接1.2 连接池 二、缓存机制2.1 缓存策略2.2 缓存管理 彩蛋致谢 前言 本文基于okhttp3.12.1…

我的一些实战的漏洞挖掘过程(一)

最近挖到的漏洞&#xff0c;在这里分享一下&#xff0c;有些信息比较敏感就打码处理&#xff0c;目标网站都换为target.com 反射xss漏洞挖掘 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;XSS&#xff09;是一种常见的Web安全漏洞&#xff0c;攻击者通过在Web应…

Windows上使用gcc

安装 下载x86_64-7.3.0-release-win32-seh-rt_v5-rev0 安装包&#xff0c;解压&#xff0c;将对应解压路径下的bin加入环境变量path&#xff0c;将mingw32-make.exe 改名make.exe&#xff0c;使用gcc同样可以在Windows上生成.o文件和.a文件&#xff0c;也可以生成.lib文件 te…

AI思维导图来了,让活动策划更加简单!

每当有活动的时候&#xff0c;都会让策划的小伙伴绞尽脑汁&#xff01; ProcessOn一直致力于提升大家的办公效率。新增的AI功能&#xff0c;可以帮助我们一键生成思维导图、流程图。让一切变得更加简单。 没有灵感&#xff1f;没有关系。不知道怎么做&#xff0c;没有关系&a…

五种原因导致孩子易患口腔溃疡,专家为你一一支招

最近&#xff0c;常接到电话咨询&#xff1a;疫情期间&#xff0c;孩子宅在家&#xff0c;反复起“口疮”怎么办&#xff1f; 这里说到的“口疮”&#xff0c;即是一种常见的口腔黏膜疾病——口腔溃疡。口腔溃疡的发病率较高&#xff0c;不仅成年人可能患病&#xff0c;不少儿…

使用PyTorch和Flower 进行联邦学习

本文将介绍如何使用 Flower 构建现有机器学习工作的联邦学习版本。我们将使用 PyTorch 在 CIFAR-10 数据集上训练卷积神经网络&#xff0c;然后将展示如何修改训练代码以联邦的方式运行训练。 什么是联邦学习&#xff1f; 我们将在这篇文章中区分两种主要方法&#xff1a;集中…