c语言基础 c语言标识符问题

下次自动登录
现在的位置:
& 综合 & 正文
【补足基础】C语言18个经典问题答录
1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非法初始式” 云云。
答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行时确定的。
2. *p++ 自增p 还是p 所指向的变量?
答:后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++ 和*(p++) 等价, 它自增p 并返回p 自增之前所指向的值。要自增p 指向的值, 使用(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。
3 我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。为什么如下的代码((int *)p)++; 不行?
答:在C 语言中, 类型转换意味着“把这些二进制位看作另一种类型, 并作相应的对待”; 这是一个转换操作符,
根据定义它只能生成一个右值(rvalue)。而右值既不能赋值, 也不能用++ 自增。(如果编译器支持这样的扩展,
那要么是一个错误, 要么是有意作出的非标准扩展。) 要达到你的目的可以用:p = (char *)((int *)p + 1);或者,因为p 是char * 型, 直接用p += sizeof(int);
4.空指针和未初始化的指针是一回事吗?
答:空指针在概念上不同于未初始化的指针:空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方。
5.我可以用0来表示空指针吗?
答:根据语言定义, 在指针上下文中的常数0 会在编译时转换为空指针。也就是说, 在初始化、赋值或比较的时候,
如果一边是指针类型的值或表达式, 编译器可以确定另一边的常数0 为空指针并生成正确的空指针值。因此下边的代码段完全合法:char *p = 0;if(p != 0)
然而, 传入函数的参数不一定被当作指针环境, 因而编译器可能不能识别未加修饰的0 “表示” 指针。在函数调用的上下文中生成空指针需要明确的类型转换,强制把0 看作指针。例如, Unix 系统调用execl 接受变长的以空指针结束的字符指针参数。它应该如下正确调用:execl("/bin/sh", "sh", "-c", "date", (char *)0);如果省略最后一个参数的(char *) 转换, 则编译器无从知道这是一个空指针,从而当作一个0 传入。(注意很多Unix 手册在这个例子上都弄错了。)
摘要:==========================|=============================|| 可以使用未加修饰的0 | 需要显示的类型转换 ||||------------------------|---------------------------|||| *初始化 | *函数调用, 作用域内无原型 |||| *赋值 | *变参函数调用中的可变参数 |||| *比较 | |||| *固定参数的函数调用 | |||| 且在作用域内有原型 | ||==========================|=============================
有两条简单规则你必须遵循:1) 当你在源码中需要空指针常数时, 用“0” 或“NULL”。2) 如果在函数调用中“0” 或“NULL” 用作参数, 把它转换成被调函数需要的指针类型
6. 既然数组引用会蜕化为指针, 如果arr 是数组, 那么arr 和&arr 又有什么区别呢?
答:区别在于类型:在标准C 中, &arr 生成一个“T 型数组” 的指针, 指向整个数组。在所有的C 编译器中, 对数组的简单引用(不包括& 操作符)生成一个T 的指针类型的指针, 指向数组的第一成员。
7. 我如何声明一个数组指针?
答:通常, 你不需要。当人们随便提到数组指针的时候, 他们通常想的是指向它的第一个元素的指针。考虑使用指向数组某个元素的指针, 而不是数组的指针。类型T 的数组蜕变成类型T 的指针, 这很方便;
在结果的指针上使用下标或增量就可以访问数组中单独的成员。而真正的数组指针, 在使用下标或增量时, 会跳过整个数组,
通常只在操作数组的数组时有用—— 如果还有一点用的话。如果你真的需要声明指向整个数组的指针,
使用类似“int (*ap)[N];”这样的声明。其中N 是数组的大小。如果数组的大小未知, 原则上可以省略N, 但是这样生成的类型,
“指向大小未知的数组的指针”, 毫无用处。
8.当我向一个接受指针的指针的函数传入二维数组的时候, 编译器报错了,这是怎么回事?
答:数组蜕化为指针的规则不能递归应用。数组的数组(即C 语言中的二维数组) 蜕化为数组的指针, 而不是指针的指针。数组指针常常令人困惑, 需要小心对待; 如果你向函数传递二位数组:int array[NROWS][NCOLUMNS];f(array);那么函数的声明必须匹配:void f(int a[][NCOLUMNS]){ ... }或者void f(int (*ap)[NCOLUMNS]){ ... }在第一个声明中, 编译器进行了通常的从“数组的数组” 到“数组的指针” 的隐式转换; 第二种形式中的指针定义显而易见。因为被调函数并不为数组分配地址,所以它并不需要知道总的大小, 所以行数NROWS 可以省略。但数组的宽度依然重要,所以列维度NCOLUMNS (对于三维或多维数组, 相关的维度) 必须保留。如果一个函数已经定义为接受指针的指针, 那么几乎可以肯定直接向它传入二维数组毫无意义。
9. 我的strcat() 不行.我试了char *s1 = "Hello, "; char *s2 = "world!";
char *s3 = strcat(s1, s2); 但是我得到了奇怪的结果。
答:这里主要的问题是没有正确地为连接结果分配空间。C 没有提供自动管理的字符串类型。C 编译器只为源码中明确提到的对象分配空间(对于字符串, 这包括字符数组和串常量)。程序员必须为字符串连接这样的运行期操作的结果分配足够的空间,
常可以通过声明数组或调用malloc() 完成。strcat() 不进行任何分配; 第二个串原样不动地附加在第一个之后。因此, 一种解决办法是把第一个串声明为数组:char s1[20] = "Hello, ";由于strcat() 返回第一个参数的值, 本例中为s1, s3 实际上是多余的; 在strcat() 调用之后, s1 包含结果。提问中的strcat() 调用实际上有两个问题: s1 指向的字符串常数, 除了空间不足以放入连接的字符串之外,
甚至都不一定可写。
10. 那么返回字符串或其它集合的正确方法是什么呢?
答:返回指针必须是静态分配的缓冲区, 或者调用者传入的缓冲区,
或者用malloc() 获得的内存, 但不能是局部(自动) 数组。
11. 我有个程序分配了大量的内存, 然后又释放了。但是从操作系统看,内存的占用率却并没有回去。
答:多数malloc/free 的实现并不把释放的内存返回操作系统, 而是留着供同一程序的后续malloc() 使用。
12. calloc() 和malloc() 有什么区别?利用calloc 的零填充功能安全吗?free() 可以释放calloc() 分配的内存吗, 还是需要一个cfree()?
答:calloc(m, n) 本质上等价于:p = malloc(m * n);memset(p, 0, m * n);填充的零是全零, 因此不能确保生成有用的空指针值或浮点零值free()
可以安全地用来释放calloc() 分配的内存。
13. 我认为我的编译器有问题: 我注意到sizeof('a') 是2 而不是1 (即,不是sizeof(char))。
答:可能有些令人吃惊, C语言中的字符常数是int 型, 因此sizeof('a') 是sizeof(int),这是另一个与C++ 不同的地方。
14. 为什么声明extern int f(struct x *p); 报出了一个奇怪的警告信息“结构x 在参数列表中声明”?
答:与C 语言通常的作用范围规则大相径庭的是, 在原型中第一次声明(甚至提到)的结构不能和同一源文件中的其它结构兼容,
它在原型的结束出就超出了作用范围。要解决这个问题, 在同一源文件的原型之前放上这样的声明:它在文件范围内提供了一个不完整的结构x 的声明, 这样, 后续的用到结构x的声明至少能够确定它们引用的是同一个结构x。
15. 我不明白为什么我不能象这样在初始化和数组维度中使用常量:const int n = 5; int a[n];
答:const 限定词真正的含义是 “只读的”; 用它限定的对象是运行时 (同常) 不能被赋值的对象。因此用 const 限定的对象的值并不完全是一个真正的常量。在这点上 C 和 C++ 不一样。如果你需要真正的运行时常量, 使用预定义宏 #define(或enum)。
16. 我能否把 main() 定义为 void, 以避免扰人的 “main无返回值”警告?
答:不能。main() 必须声明为返回 int, 且没有参数或者接受适当类型的两个参数。如果你调用了 exit() 但还是有警告信息, 你可能需要插入一条冗余的 return语句(或者使用某种 “未到达”指令, 如果有的话)。很多书不负责任地在例子中使用 void main(),
并宣称这样是正确的。但他们错了。
17. #pragma 是什么, 有什么用?
答:#pragam 指令提供了一种单一的明确定义的 “救生舱”, 可以用作各种 (不可移植的) 实现相关的控制和扩展:源码表控制、结构压缩、警告去除 (就像 lint 的老 注释), 等等。
18. “#pragma once” 是什么意思?我在一些头文件中看到了它。
答:这是某些预处理器实现的扩展用于使头文件自我识别; 它跟#ifndef技巧等价, 不过移植性差些。
【上篇】【下篇】c语言基础问题_百度知道
c语言基础问题
c语言基础问题如图,for循环中最后一个;省略掉的是什么?并且i++&4怎么理解?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
for(i&=&1;&i++&&&4;&);//i++不过是在判断后,自增一。//那么,当i=4时,不满足条件,但是自增运算符的副作用(或者叫影响),不会因为条件不满足而不执行。//所以结果显然是5
哦哦,意思是即便判断条件不满足而结束循环自增运算还是会再执行一次是吗?
采纳率:54%
省略掉循环一次后执行的语句i++ & 4理解为,先判断i&4,再i=i+1
可以用for(i=1,i&4,i++)代替吗
为什么答案是5啊,速度求教采纳
当i为3时,判断i&4,成立,i=i+1,此时i为4,继续循环;当i为4时,判断i&4,不成立,i=i+1,此时i为5,退出循环;循环结束,i为5
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。扫一扫体验手机阅读
C语言基础笔试题一
<span type="1" blog_id="1338519" userid='
87篇文章,8W+人气,0粉丝
大数据时代的微服务之路
¥51.00489人订阅
<span type="1" blog_id="1338519" userid='初学C语言 先搞懂这些基础知识再谈深度学习吧!
很多初学者都会问我,&我想学C,该怎么开始呢?&,今天我们就来聊一聊,属于初学者必须懂的知识,希望小伙伴们,能够牢记基础知识,唯有不断努力&才能更加顺利。
计算机语言:&把人与计算机之间交流的语言叫做计算机语言
计算机语言分为高级语言和低级语言
高级语言:远离硬件
低级语言:贴近硬件
指令:&是指计算机执行某种操作的命令
它由一串二进制数码组成。
一条指令通常由两个部分组成:&操作码+地址码
指明该指令要完成的操作的类型或性质
如取数、做加法或输出数据等
指明操作对象的内容或所在的存储单元地址
机器语言:&计算机本身各个部件之间沟通时所使用的语言
特点:&对计算机本身来说,只能识别由0和1代码构成的二进制指令
源程序:&把由高级语言编写的程序称为源程序
源程序&&编译程序&&目标程序
(二进制代码表示的程序,即计算机只识别目标程序)
编译程序:&如何把源程序转换成机器能够接受的目标程序,软件工作者编制了一系列的软件.通过这些软件,把用户按规定语法写出的语句一一翻译成二进制的机器指令. 这种具有翻译功能的软件称为&编译程序&
C源程序:&用C语言构成的指令序列称为C源程序
C语言的代码编写:&按C语言的语法编写C程序的过程称C语言的代码编写
C语言源程序&&文件名后缀是 .c&
经过编译后,生成文件的后缀是 .obj&
经过连接后,生成文件的后缀是 .exe&
程序设计&一般包含以下五个部分
确定数据结构
在计算机上调试程序
整理并写出文档资料
算法:&指为解决某个特定问题而才去的确定且有限的步骤.&一个算法应当具有以下五个特点
有零个或多个输入
有一个或多个输出
算法可以用各种描述方法进行描述,最常用的是&伪代码&和&流程图
C语言为结构化的语言,&C语言有三种结构:
循环结构又包含当型循环和直到型循环
先判断,后执行。最少执行0次
直到型循环
先执行,后判断。最少执行1次
简单C语言的构成和格式
C语言学习内容
C语言程序基本格式
1)命令行必须以&#&开头,最后不能加&;&结尾,因为它不是C语言的语句。
2)一对双引号中间的stdio.h是系统提供的文件名,该文件中包含着有关输入输出函数的 信息。
1)mn是主函数名,C语言规定必须用main作为主函数名
2)主函数后的一对括号中间可以是空的,但这一对括号不能省略。
3)一个C程序可以包含任意多个不同名字的函数,但必须有且只有一个主函数。
4)C程序的运行总是从主函数开始执行。
1)在主函数的下方是函数体部分,函数体总是从&{&开始,到&}&结束。
2)函数体分为定义(说明)部分和&执行语句部分。
3)可执行语句数量不限,但必须放在定义语句后面。
C语言的简单语法格式:
1)C语句必须以&;&结束,&;&是C语句的一部分,而不是语句间的分隔符。
2)注释符号&/*& &*/&必须成对出现,且不允许出现嵌套情况。&/&和&*&之间不允许有空格。
标识符的组成和分类
什么是标识符:
1、组成:由字母、数字、下划线组成。
2、组成规则:标识符不能以&数字&开头
1)区分大小写
2)在C语言中,计算机只识别长度为&8&位以内的标识符。(即标识符最多只能有8位)
标识符的分类:
1)系统已经给定含义的,我们不能在用作其他的含义(如:if、while等等)
2)C语言共有39个关键字
2、预定义标识符
1)系统已经定义好的含义,但我们可以用作其他含义的标识符。(如:printf、sf等等)
2)建议不要更改预定义标识符。
3)用户自定义标识符
1)用户自己定义的标识符。
2)自己定义的标识符要符合标识符的组成规则。
整形数据和实型数据
1、定义:程序运行中,始终不变的量。
1)整形常量(如:123)
2)实型常量(如:12.34)
double(默认情况下,编译器假定浮点型常量为double类型的精度)
3)字符型常量(如:&#39;a&#39;)
4)字符串常量(如:&#39;&#39;hello&#39;&#39;)
5)符号常量(一般由预处理器宏定义的大写字符表示)
语法格式:#define 标识符 常量
例如:#define
3.14159 (其含义是在程序中凡是出现PI时,其值都为3.14159)
1、定义:其值可以改变的量。
2、本质:内存中的存储单元。
原文标题:初学C语言?先搞懂这些基础知识再谈深度学习吧!
文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习】欢迎添加关注!文章转载请注明出处。
发布评论请先
当前AI的核心问题并不在于它们解决专业化的问题的能力—— 它们已经在某些领域完全超远了人类的表现。其....
朱小强在演讲中表示,展示广告是互联网行业的主要营销模式之一。阿里巴巴有各种不同的展示广告形式,比如横....
随着大数据和深度学习得到越来越多应用,对于底层硬件和芯片也提出了新的要求。与传统的处理器强调“处理能....
最近几年,人工智能(AI)已成为非常流行的热点话题。在过去的二十年中,人类在计算能力、数据积累、数学....
在最近接受采访时,姚颂也表示:在一年以前,该公司「决定」跟随其投资方赛灵思开始进入汽车市场。有媒体曾....
基于这个模型科学家可以再屏幕上看到细胞生生不息的模样,甚至可以直接通过屏幕来操作细胞。
他们尝试在ImageNet上将坐标特征添加到ResNet-50网络的第一个图层上。我猜作者希望在这里....
基于proteus仿真,用C语言编程,设计了一个精度20g,量程0-5kg的小型电子秤。具有计价、快....
在思考我们如何让机器学习自动化,以及如何让它普及到更多领域的人时,首先要思考的是,机器学习专家们都要....
具有16年的计算机视觉和人工智能方向的研发经验,在过去的工作中,他发表过论文十余篇,申请中国专利超过....
近年来,结合了感知、融合、决策、控制的自动驾驶技术无疑是近年最火的研发领域之一。这也得益于人工智能技....
感知、决策、控制是自动驾驶的三个技术环节,但真正的难点在哪呢?
要是关注深度学习在自然语言处理方面的研究进展,我相信你一定听说过Attention Model(后文....
至纯科技公告,公司通过发行股份及支付2.48亿元现金,拟作价6.8亿元,购买波汇科技100%股权,并....
这些被称为“牛联网” (Internet of Cows)的先驱公司正利用图像识别算法检测牛的健康问....
一、五大内存分区 内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在....
在日常的开发中,有很多地方会用到Foundation和UIKit,使用之前需要先将头文件%23imp....
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和....
近日,Salesforce发布了一项新的研究成果:decaNLP——一个可以同时处理机器翻译、问答、....
Face ID 的兴起带动了一波面部识别技术热潮。本文将介绍如何使用 OpenCV、Python 和....
近年来,人工智能深度学习技术得到突破,使得此前半温不火的人工智能迅速崛起,图像识别、神经网络、机器学....
IUT Annecy团队使用了Neural Concept的软件,计算了自行车的最大长度和宽度以及动....
和软件工程一样,机器学习中,有很多处理问题的方法,各有各的折衷。如果你正在做一项研究或者一个本地原型....
利用深度学习进行主动脉真假腔分割有赖于大量手动标注的主动脉图像来训练深度学习网络,计算量大,且对计算....
内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
高通的AI平台从骁龙820开始,到第二代骁龙830以及第三代的骁龙845。目前已经发布了基于神经网络....
1.建一个目录
2.写代码,建一个hello.c文件
命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译 器给我们输出的可执....
当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量....
我们希望在今年年底前将在此工作的AI和深度学习研究人员的数量增至三倍。
在DeDeo的主页介绍上写着,他们的研究方向是:在社会思想实验室(Laboratory for So....
今天,制作这款的APP的Tim Anglade(是的,这款APP是他一个人制作的,当然得到了很多人的....
当一个人真正想在机器学习中取得一定成就时,他需要深入微积分、线性代数,掌握一定的统计学知识,研究的深....
上一节中已经抽象出了位置性 PID 和增量型 PID 的数学表达式,这一节,重 点讲解 C 语言代码....
学什么单片机最有前途? 这是单片机初学者经常问的问题。对于这个问题,我想没有人敢下定论。因为每一种单....
飞搜科技通过采用NVIDIA Tesla P100对图像进行大规模的深度学习训练,实现了对视频监控图....
对于语音,我们使用了公开的LibriSpeech数据集中100小时的子数据集。虽然数据集不提供原始文....
这些都是除了从零学习之外的强化学习方法。特别是元学习和零次学习体现了人在学习一种新技能时更有可能的做....
|| 或操作,|| 为界将表达式分为两部分,他会先算前一部分,如果前一部分为真,他将停止运算,如果为....
这不是石建萍第一次来CVPR了。过去这八年,她几乎没落下过一届,倒也习惯了每年办一次美国签证。
中国创客第四季夏季峰会——“AI降临”在深圳举行。这是一场大咖云集、干货满满,关注人工智能最前沿命题....
我们的 AutoAugment 算法为一些最著名的计算机视觉数据集找到了增强策略,将这些策略纳入神经....
我们曾分享过的实时图像识别只是其中一种应用。我们还可以利用深度学习来做超分辨率。我们这次就分享一下用....
总体来说,机器学习(ML)的研究人员正在致力于数据驱动算法知识的创建与传播。
尽管设计一套能够在受控环境中有效执行重复任务的机器人系统(例如,在装配线上组装产品)十分平常,但设计....
换个不严谨的白话说法,深度学习的层层网络可以从数据中自动学习到有用的、高度抽象的特征,而最终目的是为....
而我们在深度学习中的卷积神经网络(如下图为例),就是模仿了人类视觉系统的处理过程。正因此,计算机视觉....
医学研究员Viksit Kumar通过基于GPU的深度学习研究,力图利用超声图像实现更准确的癌症诊断....
深度学习语音增强技术是该领域的新起之秀,却有攻入破竹之势。不同于主流而传统的数字信号处理方法,它借鉴....
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-豆丁微信公众号
君,已阅读到文档的结尾了呢~~
C语言基础题及答案
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
C语言基础题及答案
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 零基础学c语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信