
C语言
啊啊啊啊啊啊啊阿
hello world
展开
-
判断CPU是大端字节序还是小端字节序
#include union hhh{ int num; char a;};int main(){ union hhh h; h.num = 0x12345678; if(h.a == 0x78) { printf("little\n"); } else { printf("big\n原创 2016-07-25 11:23:16 · 454 阅读 · 0 评论 -
c语言编程题
问题描述 小于10的自然数中有四个数字能除尽3或5(3, 5, 6, 9),它们的和为23。 请计算所有小于1000的自然数中能除尽3或5的数字的合。然后使用标准输出cout,输出你的结果。 输入格式 无。 输出格式 一行一个整数,表示你的结果。#include int judge(int x) { if(x%3==0||x%5==0原创 2016-12-02 23:27:28 · 617 阅读 · 0 评论 -
malloc和free的理解
malloc()和free()的基本概念以及基本用法1. 函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。void free(void *FirstByte): 该函数是将之前用m转载 2016-12-02 23:25:50 · 249 阅读 · 0 评论 -
移位操作符详解
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。 移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部转载 2016-11-20 23:17:18 · 1293 阅读 · 0 评论 -
一些测试题的思路与答案
1.下面程序的输出结果是()#include #include int main() { char a[1000]; int i; for(i=0;i<1000;i++) { a[i]=-1-i; } printf("%d",strlen(a)); return 0;}答案是255。因为char的数范围是-1原创 2016-11-30 21:51:45 · 344 阅读 · 0 评论 -
C和C++中struct和typedef struct的分析
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实转载 2016-11-17 22:37:00 · 200 阅读 · 0 评论 -
c的一个小注意点
下面举个例子,判断回文的:#include#include#define MAX_SIZE 100int main(){ char src[MAX_SIZE]; int i = 0; int len; //① printf("请输入字符串:"); scanf("%s",src); len = strlen(src); //② while(i <= (原创 2016-11-28 22:52:45 · 399 阅读 · 0 评论 -
字节、半字、字对齐方式详解
看到写的这篇文章对于对齐方式的理解蛮好的,因此和大家分享,不会或忘了的可以看一看!一、字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作转载 2016-11-15 22:42:14 · 417 阅读 · 0 评论 -
密码用*表示
#include #include #include int main(){ int x = 0; char c; char Password[6]; printf("请输入密码\n\n"); while(x < 5 && c != 13) //13是回车符的ASCII码 { c = getchar();原创 2016-11-11 23:35:26 · 586 阅读 · 0 评论 -
两道程序题
1.编写一个函数,字符串逆序:#include#include#include void reverse(char *str,int len){ int i; char temp[100]; for(i = 0;i < len;i++) { temp[i] = str[i]; } temp[len] = '\0'; for(i = 0;i<len;i++) {原创 2016-12-04 00:39:57 · 363 阅读 · 0 评论 -
strstr函数
字符串函数strstr(char *s1,char *s2)是返回字符串s1中首次出现s2的地址函数实现:[cpp] view plain copy char *my_strstr( char *s1, char *s2) { if(*s2 == '\0') { retur原创 2016-12-12 22:39:29 · 245 阅读 · 0 评论 -
c语言==判断一个数是否为2的整数次方【不使用循环】
对于判断一个数是否为2的N次方问题,通常想到的最为直接的办法就是对这个数不断对2取余,为0就将该数变为该数除以2,直到最后该数为1为止。void judge(int n) { while(!(n % 2)) { n = n / 2; if(n == 1) { pri原创 2016-12-20 22:25:30 · 3521 阅读 · 0 评论 -
strcpy sprintf memcpy 区别
strcpy 函数操作的对象是字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。 sprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。 memcpy 函数顾名思义就是 内存拷原创 2016-12-28 22:14:06 · 233 阅读 · 0 评论 -
合并两个递增链表
struct node{int num;struct node *next;};typedef struct node Node;typedef Node * Link; Link Merge(Link head1, Link head2){If(head1 == NULL) return head2;If(head2 == NULL) return head1;Link原创 2017-01-04 22:36:55 · 257 阅读 · 0 评论 -
一只青蛙一次可以跳上1—n级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?(递归)
int jump(int number){ int count = 0; if(number < 2) { return 1; } for(int i = number; i >= 0; i--) { count += junp(i); } return count;}原创 2016-12-19 22:44:04 · 545 阅读 · 0 评论 -
约瑟夫环
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。#include #include #include struct node{原创 2016-12-22 22:17:16 · 239 阅读 · 0 评论 -
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。 #define BIT3 (0x1 << 3)static int a;void set_bit3(void){ a |= BIT3;}void clear_bit3(void){ a &= ~BIT3;}原创 2016-12-21 22:21:59 · 8977 阅读 · 3 评论 -
条件编译
这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2转载 2016-11-25 23:26:47 · 260 阅读 · 0 评论 -
函数变相做到返回多个值的方法
2方法1:利用全局变量 分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。转载 2016-12-07 23:02:23 · 325 阅读 · 0 评论 -
C语言一些变量的地址以及堆和栈的概念
在linux写一个程序,里面全局变量,局部变量,static,const,常数,数组,输出这些变量的地址:程序如下:#include int b_n;int b_y = 2;static int b = 3;const int bb = 4;void part(){ int a_n; int a_y = 1; static int a = 1; c原创 2016-10-18 19:04:29 · 1285 阅读 · 0 评论 -
判断字符串是不是回文
#include #include int islevel(const char *ptr){ int i; int found = 1; //1表示是回文,0表示不是 if (ptr == NULL) //有效性检测 { return -1; } //获取字符串长度 int len = strlen(ptr)转载 2016-10-17 22:41:01 · 328 阅读 · 0 评论 -
什么是野指针?如何避免野指针?
野指针不是 NULL指针,它是随即指向一块内存的指针。野指针是很危险的,会导致内存泄漏,if语句对它不起作用。 导致野指针的原因有两种: (1)野指针指向了一块没有访问权限的内存。(即指针没有初始化) (2)野指针指向了一个已经释放的内存。 因为野指针是因为我们的不良编程习惯造成的,所以我们养成良好的编程习惯才能尽可能避免野指针的出现。下面是一些好的编程习惯:原创 2016-07-15 20:35:21 · 2406 阅读 · 0 评论 -
ralloc、calloc和malloc的用法、区别。实现原理
三个函数的声明:void *malloc(unsigned size);void *calloc(size_t n,size_t size);void *realloc(void *mem_address, unsigned int newsize); 三个函数都在文件中,其中void * 是万能指针,但是不能取值,一般需要什么数据类型,就用什么数据类型;若是全用void *,则可能原创 2016-07-18 18:54:56 · 664 阅读 · 0 评论 -
C语言中strlen、strcpy、strncpy、strcat、strnact、strcmp、memcpy函数的实现
int mystrlen(char *src)//strlen函数{ int i; i = 0; while(*src != '\0') { src++; i++; } return i;}char *mystrcpy(char *dest,char *src)//strcpy函数{ char *t原创 2016-07-16 10:54:05 · 624 阅读 · 0 评论 -
内联函数
一、什么叫inline函数? inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间)。这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入转载 2016-07-26 10:08:56 · 241 阅读 · 0 评论 -
关键字的作用以及注意事项
register: 如果一个变量被register修饰,就意味着该变量会作为一个寄存器变量,让该变量的访问速度达到最快。register的作用:请求编译器尽可能(因为CPU内部寄存器有限)地将变量存在CPU内部寄存器中,从而省去了CPU从内存抓取数据的时间,提高了运行效率。如果一个变量频繁地被访问,可以用register修饰这个变量。 使用register有以下注意原创 2016-07-25 09:43:01 · 495 阅读 · 0 评论 -
进程的虚拟地址划分
进程:在程序被执行就形成一个进程。为了解决内存稀缺的问题,变成进程的程序就会被分配一个4G的虚拟地址空间。系统为每个进程所分配的4GB虚拟地址空间(32位系统),用来存放进程的虚拟地址,再通过MMU(内存管理单元)将虚拟地址映射到物理内存地址。1G内核 下面3G是用户栈空间(管理权限:系统)局部变量,函数形参,自动变量 堆空间(管理权限:原创 2016-07-14 13:40:21 · 397 阅读 · 0 评论 -
什么是行缓冲?printf输出的条件
缓冲只提输入输出不直接将信息内容放到指定地点,而是行放到缓冲区,刷新缓冲区的时候才将这些内容输入、出到指定位置。行缓冲就是说每一行刷新一次缓冲区,就是见到换行符的时候把缓冲区的内容送到指定位置,如果是输出的话通常是屏幕。缓冲区一般是一块系统指定的内存区域。printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下: 1 缓冲区原创 2016-07-14 13:33:11 · 734 阅读 · 0 评论 -
为什么嵌入式要用C语言编写?
首先从C语言的特点开始说起:1.C语言具有出色的可移植性,能在多种不同体系结构的软/硬件平台上运行可移植性并不是说代码不需要修改即可在任何平台上运行,而是代码的修改量少。比如用函数来代替所要实现的功能,用宏定义来代替一些常量,这些都可以提高C语言的可移植性。2.具有简洁紧凑、使用灵活的语法机制,并能直接访问硬件。虽然汇编语言也能够直接访问硬件,而且运行效率高,但是汇编语言是低级语言原创 2016-07-14 10:08:57 · 1015 阅读 · 0 评论 -
指针与数组的区别 and 对函数的理解
从空间分配上看,数组是静态分配,空间是连续的,而指针是动态分配,空间不一定连续,只从指针分配空间的原理可以看出;从访问效率上看,数组是直接访问,所以效率较高,而指针是间接访问,效率自然是没有数组高;从安全性上看,数组易导致访问越界的问题,而指针容易导致内存泄漏;作为函数形参时,数组都会默认转化为相对应的指针,比如一维数组名代表一维数组首元素的地址。C语言中函数可以提高代码的复用原创 2016-07-20 20:03:25 · 280 阅读 · 0 评论 -
C语言是如何体现面向对象的?
C语言是一个面向过程的程序设计语言,但是也存在一些面向对象的机制。面向对象的三个基本特征是封装、继承和多态。 ① 继承: C++可以通过类来进行继承,而C语言的继承则是通过结构体来实现的。一般有两种方法:一个是声明在结构体内,另一种是声明在结构体外。下面是声明在结构体中的例子typedef struct parent{ int x;}Parent原创 2016-07-21 09:39:41 · 816 阅读 · 0 评论 -
常量指针和指针常量
const char* p;//1char* const p = a;//2char* p = "abc";//3第一句定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但是指针本身可以修改,即“*p=‘b’”是非法的,*p是p指向的常量的第一个字符,是个常量,不能改变。“p=&q”是可以的,指针可以指向 不同的地址。第二句定义了一个指针常量,即指针本原创 2016-10-01 21:08:22 · 176 阅读 · 0 评论 -
C语言练习题-字符串中找连续最长字符串
题目:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr);功能:在字符串中找出连续最长的字符串,并把这个串的长度返回,并把这个最长数字串付给其中的一个函数参数outputstr所指内存。例如"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值原创 2016-10-16 22:21:48 · 1125 阅读 · 0 评论 -
指针函数与函数指针
1.函数指针:即指向这个函数的指针,定义为“数据类型 (*fun)(参数列表)”,()的优先级比*高,所以*fun加括号,比如“void (*fun)(int *,int *);”。2指针函数:即返回值是指针的函数,定义为“数据类型 *fun(参数列表);”,如"char * fun(int *,int *);",即返回值为char*型。在C语言中,函数也是有地址的,那么把函数的地原创 2016-09-30 19:08:12 · 164 阅读 · 0 评论 -
右左法则
右左法则 对于一些长或者复杂的声明的名称,理解起来有点困难。但是右左法则能很好的解决这个问题。 而右左法虽不是不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的。这个法则的具体的应用:从内部括号开始阅读(必须从变量名开始)声明,向右看,然后向左看。当碰到一个括号的时候就原创 2016-09-29 18:16:53 · 344 阅读 · 0 评论 -
break与continue
break语句通常用在循环语句和开关语句中。break用在switch语句中时,可以使程序跳出switch而执行switch后面的语句;若没有break,则将成为一个死循环而无法退出。当break用于循环语句时,可使得程序终止循环而执行后面的语句注意:break语句对if-else的条件语句不起作用 在多层循环中,一个break语句只向外跳一层continue语句的作用是跳原创 2016-09-28 21:47:43 · 186 阅读 · 0 评论 -
局部变量和全局变量
局部变量也称为内部变量,是在函数内做定义说明的,其作用域仅限于函数内,离开函数后再使用这种变量是非法的。比如:int f(int a){ int b; int c;}a,b,c在函数内有效,其中a为形参,b,c为一般变量。关于局部变量的作用域:1.主函数中定义的变量只能在主函数中使用,不能在其他函数中使用。同样的,主函数也不能使用其他函数中的变量。2.形参变量是原创 2016-09-27 20:17:41 · 152 阅读 · 0 评论 -
void*的详解
void在英文中作为名词的解释为“空虚;空间;空隙”;而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”。void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为我们人提供注释,而是为编译器提供一种所谓的注释。void的作用:1.对函数返回的限定,这种情况我们比较常见。2.对函数参数的限定,这种情况也是比较常见的。一般我们常见的就是这两种情原创 2016-10-23 21:22:18 · 277 阅读 · 0 评论 -
一个有意思的题目:单循环实现乘法表
#includeint main(){ int i, j; for (int i = 1, j = 1; j <= 9; i++) {//只有一个for循环,其中i控制每行输入的算式个数,j控制共有多少行。 printf("%d*%d=%2d ", i, j, i*j); if (i == j) {//表示这一行输入结束,需要换行,并且下一行i需原创 2016-09-17 00:02:35 · 382 阅读 · 0 评论 -
指针和内存
C程序编译后,三种形式使用内存@静态/全局内存静态声明的变量和全局变量使用的内存都在这部分,所有函数能访问全局变量,静态变量的作用域则局限在定义他们的函数内部@自动内存这些变量在函数内部声明,并且在函数被调用时才创建。@动态内存内存分配在堆上作用域生命周期全局内存整个转载 2017-02-22 22:24:52 · 364 阅读 · 0 评论