
C语言
C语言基础知识 常见面试题
hsxhzby
这个作者很懒,什么都没留下…
展开
-
指针常量和常量指针
参考自:《C和C++程序员面试秘籍》指针常量:它本身不能被修改,指向的内容可以被修改。常量指针:它本身可以被修改,指向的内容不能被修改。const char *node1 = "abc";char *const node2 = "abc";char *node3 = "abc";node1[2] = 'k';/*error: assignment of read-only location ‘*(node1 + 2u)’*/*node1[2] = 'k';/*invalid type arg原创 2020-10-17 16:29:50 · 429 阅读 · 0 评论 -
复杂指针的声明和关于指针的几个小例子
参考自:《C和C++程序员面试秘籍》a: 一个有10个指针的数组,该指针是指向一个整型数的int *a[10]b:一个指向有10个整型数数组的指针int (*a)[10]c:一个指向函数的指针,该函数有一个整形参数并返回一个整型数int (*fun)(int)d:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数int (*fun[10])(int)如何解读复杂指针?int (*func)(int *p);解析上面这行代码:首先找到未定义的标识原创 2020-10-17 15:50:08 · 249 阅读 · 0 评论 -
字节对齐
字节对齐的细节和编译器实现有关,一般而言,需要满足3个准则:1:结构体变量的首地址能够被其最宽基本类型成员的大小所整除2:结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍。如有需要,编译器会在成员之间加上填充字节。3:结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节。对齐是可以更改的,使用#pragma pack(x)可以改变编译器的对齐方式。C++固有类型的对齐取 编译器对齐方式(默认是8,除非#pragma pac原创 2020-10-15 16:27:04 · 215 阅读 · 0 评论 -
一个字由两个字节组成
字(word)、字节(byte)、位(bit)字 word : 1字=2字节(1 word = 2 byte ) 字长是指字的长度字节byte :1字节=8位(1 byte = 8 bit)位 bit一个字的字长为16一个字节的字长是8波特率bps 是 bits per second 的简称。一般数据机及网络通讯的传输速率都是以「bps」为单位。如56 Kbps、100.0Mbps 等。Bps即是Byte per second 的简称。而电脑一般都以Bps显示速度,如1Mbps 大约等同 12转载 2020-10-15 11:41:34 · 5148 阅读 · 0 评论 -
C语言宏参数的字符串化和宏参数的连接
在宏定义中,有时还会用到 # 和 ## 两个符号,它们能够对宏参数进行操作。的用法用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号。例如有如下宏定义:#define STR(s) #s那么:printf("%s", STR(c.biancheng.net));printf("%s", STR(“c.biancheng.net”));分别被展开为:printf("%s", “c.biancheng.net”);printf("%s", ““c.biancheng.net””);转载 2020-10-15 11:28:52 · 1160 阅读 · 0 评论 -
c++中main函数执行完后还执行其他语句吗
可以用atexit()函数来注册程序正常终止时要被调用的函数,并且在main()函数结束时,调用这些函数的顺序与注册它们的顺序相反。#include <stdio.h>#include <stdlib.h>void fn1(void);void fn2(void);int main(){atexit(fn1);atexit(fn2);printf(“main exit…\n”);return 0;}void fn1(){printf(“calling fn原创 2020-10-15 11:17:31 · 399 阅读 · 0 评论 -
C++与C有什么区别?
C是一个结构化语言,它的重点在于算法和数据结构。对语言本身而言,C是C++的子集。C程序的设计首先考虑的是如何通过一个过程,对输入进行运算处理,得到输出。对于C++,首先考虑的是如何构造一个对象模型,让这个模型能够配合对应的问题,这样就可以通过获取对象的状态信息得到输出或实现过程控制。因此,C与C++的最大区别在于,它们用于解决问题的思想方法不一样。C实现了C++中过程化控制及其他相关功能。而在C++中的C,相对于原来的C还有所增强,引入了重载、内联函数、异常处理等。C++更是拓展了面向对象设计原创 2020-10-15 11:04:53 · 461 阅读 · 0 评论 -
带符号的char类型取值范围为什么是-128——127?
。。。原创 2020-10-14 23:15:56 · 205 阅读 · 0 评论 -
有符号变量和无符号变量的值的转换
当表达式中存在有符号类型和无符号类型时,所有的操作数都自动转换成无符号类型。有符号数如何转换成无符号数呢?其实并不需要转换,只不过是从内存中读取时不再认为最高位是符号位即可。举例:-7这个负数在内存中按照补码的形式存储,为11111111 11111111 11111111 11111001-7与正数做运算,根据规则是先转换为无符号数,再做运算,那就是说是;11111111 11111111 11111111 11111001原创 2020-10-14 22:13:20 · 566 阅读 · 0 评论 -
i++和++i 哪个效率更高
答案:如果只是内建数据类型,它们的效率差别不大(去除编译器优化的影响)。如果是自定义数据类型(主要指类),++i效率更高。此时我们不需要再做汇编代码的分析了,因为前缀式(++i)可以返回对象的引用,而后缀式只能返回对象的值,所以产生了在大对象时产生了较大的复制开销,引发效率降低。...原创 2020-10-14 15:10:49 · 316 阅读 · 0 评论 -
c语言中-号和++ --运算符优先级
-i++;-i--先输出-i,再分别进行+1和-1操作切记:不是对-i进行+1和-1原创 2020-10-14 15:01:42 · 2349 阅读 · 0 评论 -
c++的::域操作符
在C++中可以通过域操作符::来直接操作全局变量:: value = 2;如果代码里同时有全局和局部的value,修改的是全局变量value,而不是局部变量value原创 2020-10-14 14:55:49 · 625 阅读 · 0 评论 -
const全局变量和const局部变量是否可以修改
注意:以下程序编辑和运行于centos7 gcc环境,不同的编译器可能略有不同#include <stdio.h>#include <stdlib.h>const int a = 10;int main(){// int *pa = &a; //warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default]//原创 2020-07-18 11:40:26 · 1232 阅读 · 0 评论 -
linux下size命令可以查看一个可执行二进制文件基本情况
首先编译生成可执行文件,假如源文件名为test.c,那么gcc -o test test.c生成可执行文件test。然后用命令size test查看该可执行二进制文件的基本情况[lll@localhost code]$ size testtext data bss dec hex filena原创 2020-07-17 22:46:54 · 1289 阅读 · 0 评论 -
scanf(“%[^\n]“, str)正则用法
scanf() 遇到空格结束输入可以用 scanf("%[^\n], str") 输入一行数据包括空格,直到遇到换行符 ’ \n ’scanf("%*[^\n]");//清理输入缓冲区中第一个\n之前的所有字符scanf("%*c"); //清理输入缓冲区中第一个字符,也就是上次遗留下的\nscanf("%*[^\n]%*c")是把这两句放在一起...原创 2020-07-05 16:33:30 · 3070 阅读 · 2 评论 -
输入输出函数读取缓冲区数据的问题(scanf 、getchar、stdin)
https://www.cnblogs.com/yhjoker/p/7530837.htmlscanf函数读取缓冲区数据的问题原创 2020-07-05 15:19:13 · 232 阅读 · 0 评论 -
#ifndef #define #endif 和 extern "C"的作用
ifndef #define #endif 防止头文件被重复引用被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include “a.h” 和#include "c.h"此时就会造成c.h重复引用。头文件被重复引用引起的后果:有些头文件重复引用只是增加...原创 2020-04-20 15:53:28 · 537 阅读 · 0 评论 -
C语言函数参数--数组长度
int read_column_numbers(int columns[], int max){}在函数声明的数组参数中,并未指定数组的长度。这种格式是OK的,因为无论调用函数的程序传递给它的数组参数的长度是多少,这个函数都将照收不误。这是一个伟大的特性,它允许单个函数操纵任意长度的一维数组。这个特性不利的一面是函数没法知道该数组的长度。如果确实需要数组的长度,它的值必须作为一个单独...原创 2020-03-11 16:03:34 · 1710 阅读 · 0 评论 -
编译 链接
在绝大多数UNIX系统中,C编译器被称为cc。编译并链接一个完全包含于一个源文件的C程序:cc program.c这条命令产生一个称为a.out的可执行程序。中间会产生一个名为program.o的目标文件,但它在链接过程完成后会被删除。编译并链接几个C源文件cc main.c sort.c lookup.c当编译的源文件超过一个时,目标文件便不会被删除。这就允许你对程序进行修改后...原创 2020-03-11 15:30:42 · 157 阅读 · 0 评论 -
C语言 gets函数 puts函数 getchar函数
gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。一行输入由一串字符组成,以一个换行符(newline)结尾。gets函数丢弃换行符,并在改行的末尾存储一个NULL字节(一个NULL字节是指字节模式为全0的字节,类似’\0’这样的字符常量)。然后,gets函数返回一个非NULL值,表示该行已被成功读取。当gets函数被调用,但事实上不存在输入行时,它就返回NULL值,表...原创 2020-03-11 14:41:43 · 962 阅读 · 0 评论 -
C/C++语言基础知识 之 引用和指针
关于引用引入是C++引入的新语言特性。1 int &rn = a;-----------------------------------------------2 int* p = &a;3 int* &pa = p;4 (*pa)++;5 pa = &b;6 (*pa)++;L1:声明rn为变量a的一个引用,不需要为...原创 2020-02-18 11:33:07 · 190 阅读 · 0 评论 -
C语言常见问题
在C语言中,有一个“流”的概念;流可以分为两种类型:文本流(文件)和二进制流(文件);文本流是解释性的,最长可达255个字符;二进制流是非解释性的,一次处理一个字符。在用C语言编程的时候,我们都是用#include指令包含类型为".h"的文件,那么可以用该指令包含类型不为".h"的文件吗?答案是:可以。我也是刚才看到这个的。在C语言中,我们经常使用宏;那么编程的时候,是使用宏更好,...转载 2020-02-17 11:17:17 · 156 阅读 · 0 评论 -
C语言常见面试题3 之 基础知识
(1)i++和++i哪个效率更高?对于内建数据类型,二者效率差别不大(去除编译器优化的影响)对于自定义数据类型(主要是类),因为前缀式(++i)可以返回对象的引用;而后缀式(i++)必须返回对象的值,所以导致在大对象时产生了较大的复制开销,引起效率降低。(2)不使用任何中间变量如何交换a b的值?void swap(int& a, int& b)//采用引用传参的方式...原创 2020-02-17 10:08:30 · 1065 阅读 · 0 评论 -
C语言常见面试题2 之 常考排序算法
(1) 编程实现直接插入排序#include <iostream>using namespace std;void insert_sort(int a[], int n){ int i, j, temp; for(i=1; i<n; i++) { temp = a[i]; for(j=i-1; j>=0 && temp <a[j...原创 2020-02-13 16:31:40 · 1109 阅读 · 0 评论 -
C语言常见面试题1 之 基础知识
(1)如何用C语言编写死循环?首选方案,也是C程序员最常用的方案如下:while(1){}第二种方案:for(;;){}第三种方案:Loop:...goto Loop;不过,大多数人是会用第一种的。(2)如何访问特定位置的内存?嵌入式系统的某些工程里,会要求设置一个绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI...原创 2020-02-12 22:22:14 · 649 阅读 · 0 评论