C
ZM_iTUDOU
爱高跟,也爱跑鞋,喝茶也喝酒。
展开
-
局部指针变量为什么可以正确返回?
作为一个菜鸟级别的程序员,我也知道一句话叫做:不能返回局部指针变量最近有一个问题困扰了我很久,到底能不能返回局部变量。。局部指针变量。。。先看下面的代码#include <stdio.h>#include <stdlib.h>#include <string.h>char *func(){ char *p = (char *)malloc(100); strcpy(p, "he原创 2017-08-14 15:07:07 · 1169 阅读 · 0 评论 -
n&(n-1)的妙用
n&(n-1)的妙用 (转)今天无聊拿起《编程之美》看了下,发现原来n&(n-1)还有很多妙用。原理:n与n-1的区别在于,对于n,从右向左数的第一个"1"开始一直到右,和n-1,完全相反n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000可以看到原本最转载 2016-07-05 09:41:27 · 427 阅读 · 0 评论 -
编译链接中的-可重定位目标文件
可重定位目标文件理解:资料一:汇编器所产生的目标文件至少包括三个区,即文本区(text),数据区(data)和bss区。文本区一般包括程序的代码和常量,数据区通常存放全局变量等内容,bss区用于存放未初始化的变量或作为公共变量存储空间。在一个目标文件中,其text区从地址0开始,随后是data区,再后面是bss区。而要运行程序,必须装载到内存中,所以这些区的地址需要在内存中重新安排转载 2016-07-09 10:25:34 · 7564 阅读 · 0 评论 -
C学习笔记(六)字符串遍历
字符串遍历的三种方法1.已知循环次数用for for (i = 0; i 2.未知循环次数用while while(src[i] != ‘\0’)3.指针例:字符串转化为整数#include#include#define MAX_SIZE 100int my_atoi(char *src){ int i = 0;原创 2016-07-14 14:52:13 · 4173 阅读 · 1 评论 -
C学习笔记(五)变量与常量
1. 什么是变量?变量的特点变量的三大特点:数据类型:主要说明变量占用内存空间大小如int作用域:变量的有效性范围,即变量的适用范围存储类型:变量在内存中的存储方式。不同的存储方式,影响变量在内存的生存周期2. 变量的存储区域执行一个程序,被称作进程,为解决内存资源稀缺,CPU会给这个进程分配4G的虚拟地址空间(进程的活动空间),也就是变量的存储空间原创 2016-07-14 14:10:39 · 679 阅读 · 0 评论 -
C学习笔记(三) 数据类型分类及类型转换
数据类型的基本知识点数据类型的分类类型转换1. 隐式类型转换隐式类型转换分为算术转换,赋值转换,输出转换(1)算术转换:进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数必须转换成同一类型的数据才能运算,算术转换原则为: 在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型,如:若运算数中有double型或原创 2016-07-11 15:18:25 · 427 阅读 · 0 评论 -
C学习笔记(一) C语言和汇编语言的区别
C学习笔记(一) C语言和汇编语言的区别 C语言和汇编语言的区别:汇编:效率高,对硬件的可操控性更强,体积小,不易维护,可移植性很差 C:效率比较低,硬件可操控性比较差,目标代码体积大,容易维护,可移植性很好 汇编语言运行效率高的原因:(转载)1. 汇编语言实质上是机器语言的助记符。 CPU只能运行它所支持的指令集,而这些指令集当中的每条指令都是一些二进制原创 2016-07-11 09:43:13 · 21980 阅读 · 0 评论 -
合并两个递增的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。方法一:递归 : 要注意递归结束的条件及代码的鲁棒性方法二:非递归。需要较多的指针方法一Link MergeList(Link head1,Link head2){ if(head1 == NULL) { return head1; } else原创 2016-12-07 09:34:00 · 658 阅读 · 0 评论 -
结构体变量的引用和赋值
结构体变量的引用和赋值 在今天之前,一直以为结构体变量的两种引用和赋值方法是可以随便换的,但其实并不是这样,想想也是,要不然干嘛定义两种方法,太浪费了啊回归正题,结构体变量的引用和赋值,有两种形式,一种是用符号“.”,玲一种是用符号“->”一般结构体变量用“.”,结构体指针变量用“->” 举例:一般结构体变量struct msg{ int cmd;原创 2016-12-26 09:04:20 · 12714 阅读 · 1 评论 -
通讯录(链表+文件实现)+ 反思
最近,帮别人改通讯录(链表+文件实现),大概是自己学的不够通透,曾经犯过的错误还是继续犯着。。。记录下来,警戒自己。#include #include #include #include #define LEN sizeof(person)struct stu /*定义结构*/{ char name[20]; /*姓名*/ char email[原创 2016-12-25 13:06:49 · 768 阅读 · 0 评论 -
strlen sizeof 的区别
Strlen sizeof 的区别 1. Sizeof是运算符,strlen是函数2. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。3. strlen只能用char*做参数,且必须是以''\0''结尾的,而sizeof可用类型做参数,还可用原创 2016-12-14 23:58:25 · 425 阅读 · 0 评论 -
改错 字符串倒序
请找出下面代码中的所有错误。说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”。1234567891011121314151#include "string.h"2int main()原创 2017-01-01 19:34:29 · 1647 阅读 · 0 评论 -
单链表逆序 多种方法总结
经常会碰到一道关于链表的题目——链表逆序,今天就来进行一下总结 一. 使用额外内存空间实现 和数组逆序一样,链表的逆序也可以使用额外的结点空间做中转,但这也分有两种思路。 假设链表为A->B->C->D->E 1.先取出链表的最后一个E,然后将E作为新链表的头, 再依次取出原来链表的最后一个节点,插入到新链表的最后位置。 思原创 2017-06-06 00:16:22 · 700 阅读 · 0 评论 -
字符串长度乘积最大值 位操作
// "abcw" "baz" "foo" "bar" "xtfn" "abcdef"//return 16//"abcw" "xtfn"//对于单词字符串的字符出现情况我们可以使用一个哈希表来记录,由于范围限定在‘a’~'z',//我们可以直接使用26位的数组,由于只需标记字符是否出现(状态只有0和1),//因此我们只需要用一个位来表示该字符是否存在,因此我们只需要一个32位的整型变量,原创 2017-07-27 17:11:11 · 672 阅读 · 0 评论 -
想让程序跳转到绝对地址0x100000处执行,该如何做?
嵌入式笔试题:想让程序跳转到绝对地址0x100000处执行,该如何做?网上看到有如下答案:((void()(void))0x100000)();经过在VC++6.0和Linux gcc4.4.3下测试,均不能通过编译。VC++6.0报错:error C2100: illegal indirectionGCC报错:error: void value not ignored as it ought to转载 2017-08-10 11:36:15 · 2991 阅读 · 0 评论 -
GetMemory 改错
GetMemory 改错 试题4:void GetMemory( char *p ) { p = (char *) malloc( 100 ); }void Test( void ) { char *str = NULL; GetMemory( str ); strcpy( str, “hello world” ); printf( str ); } 试题5:转载 2017-08-10 11:29:22 · 486 阅读 · 0 评论 -
排序大综合
排序大综合//排序 大综合 测试 我记住了没!!#include <iostream>#include <stdlib.h>#include <string.h>using namespace std;void BubbleSort(int a[], int n){ if(NULL == a || n == 0) { return ; } fo原创 2017-08-01 10:27:39 · 367 阅读 · 0 评论 -
位运算实现加减乘除四则运算
//只用逻辑运算实现加法int add(int a, int b){ if(0 == b) { return a; } int sumTemp = a ^ b; int carry = (a & b) << 1; return add{sumTemp, carry};} //只用逻辑运算实现减法int minus(int a, int b){ b = add(~b,原创 2017-07-18 20:43:11 · 624 阅读 · 0 评论 -
未定义行为
下列 C 代码中,不属于未定义行为的有___正确答案: C int i=0;i=(i++);char *p=”hello”;p[1]=’E’;char *p=”hello”;char ch=*p++;int i=0;printf(“%d%d\n”,i++,i--);都是未定义行为都不是未定义行为转载 2017-07-14 09:36:04 · 299 阅读 · 0 评论 -
32位int 最小负整数
以下代码的执行结果是().1234int main(){ int i=-2147483648; return printf("%d,%d,%d,%d",~i,-i,1-i,-1-i);}正确答案: D 你的答案: C (错误)A. 0,2147483648,2147483649,2147483647B原创 2017-06-09 09:33:50 · 9245 阅读 · 0 评论 -
扩展 sizeof和strlen malloc
1.32位机上根据下面的代码,问哪些说法是正确的?signed char a = 0xe0;unsigned int b = a;unsigned char c = a;正确答案: C A. a>0 && c>0为真B. a == c为真C. b的十六进制表示是:0xffffffe0D. 上面都不对 解析:1. 扩展问题符号位原创 2017-06-01 17:55:58 · 622 阅读 · 0 评论 -
函数执行顺序 打印顺序
下列程序的运行结果是( ) #include main(){ struct t { int x; int *y; }*p; int a[]={1,2}; int b[]={3,4}; struct t c[2]={5,a,6,b}; p=c; printf("%d,%d",*(p->y),原创 2017-06-06 08:48:18 · 629 阅读 · 0 评论 -
strstr函数 自己实现
实现自己的strstr函数:返回主串中子字符串的位置后的所有字符。如:主串“12345678”,字串“45”,函数返回“45678”#include //#include#includeconst char* strstr(const char *src, const char *dst) { //入口参数检查 assert原创 2016-12-06 01:25:16 · 3044 阅读 · 1 评论 -
输出蛇形代码
1. 编写一个程序,输出类似的蛇形代码:1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9 #include #include int main(){int n;int x,y,round;//a[x][y],x是二维数组的第一个下标,y是二维数组的第二个下标,//rou原创 2016-12-09 00:10:12 · 444 阅读 · 0 评论 -
C学习笔记(十)字符串 自己实现字符串函数
字符串一.字符串就是首字符的地址 二.字符串函数自己实现字符串函数 字符串长度函数strlen#include size_t strlen(const char *s); #include#define MAX_SIZE 100int my_strlen(char *src){ int len = 0; while( *src != '原创 2016-07-19 23:33:38 · 655 阅读 · 0 评论 -
malloc calloc realloc使用及实现原理
malloc()void*malloc(size_t size);malloc 在内存的动态存储区中分配一块长度为size字节的连续区域,size为需要的内存空间的长度,返回该区域的地址 calloc ( )void*calloc(size_t nmemb, size_t size);malloc 在内存的动态存储区中分配一块长度为nmemb(参数个数)*size(单位元素原创 2016-07-19 17:02:53 · 1745 阅读 · 0 评论 -
C学习笔记(八)野指针详解
1.野指针:指向不确定地址的指针变量2.野指针导致内存泄漏:(1)访问一块没有权限的内存当正确使用指针时,系统应经将相应的内存分配给用户,但是如果指向没有分配的内存,系统会判定我们没有权限。(即局部指针变量未初始化,系统会默认初始化,给它分配一个随机地址,这地址分配的内存空间未申请,即没有权限)(2) 访问了已经释放了的内存3.如何避免野指针因为野原创 2016-07-18 17:34:15 · 427 阅读 · 0 评论 -
C语言之父丹尼斯·里奇:乔布斯脚下的巨人肩膀
人们对里奇的纪念,远不及对乔布斯铺天盖地的悼念。可是,里奇值得人们那样去做。 还是有人出来说了句公道话。 “史蒂夫·乔布斯上周去世引发了巨大的反响,这当然合情合理。即便影响实际上更为广泛,丹尼斯却不为公众所知”,罗伯·派克说。罗伯是一名在Google工作的程序员,作为业界的传奇性人物,曾经与里奇在著名的贝尔实验室共事20年。 周三晚间,派克在Google+上发表消息称转载 2016-07-07 20:35:49 · 4041 阅读 · 0 评论 -
C学习笔记(九)指针
一.定义与初始化1.1.如何理解指针?指针是一个变量,保存的是地址指针的字节长度固定为4个字节 1.2.定义指针的几种规范int *p;int * p = & num; 二.* 与& 运算符详解2.1. 指针的类型和指针所指向的类型指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具原创 2016-07-18 20:25:15 · 446 阅读 · 0 评论 -
C学习笔记(七)运算符与表达式
1. 算术运算符——自增,自减运算符例1int num ;int i = 2;num = (i++) + (i++)+ (i++) + (i++) ;结果:num = 6; i = 6;解析:运算符的结束标志:分号;逗号,函数括号()例2int num;int i = 2;num = (++i) + (++i) +(++i) +(++i);结果:num =原创 2016-07-16 10:15:25 · 337 阅读 · 0 评论 -
C语言关键字
registerregister关键字的作用:请求CPU尽可能让变量的值保存在CPU内部的寄存器中,减去CPU从内存中抓取数据的时间,提高程序运行效率。 register作用的实现原理:扩展:CPU组成,计算机系统组成,数据处理流程 什么时候使用register?一般,我们将频繁被访问的变量,用register修饰(因为CPU内存资源是有限的,是稀缺的,不可能将原创 2016-07-27 16:08:21 · 1019 阅读 · 0 评论 -
位操作训练
Training2:位操作训练要求:不使用数组1. 题目:请编写一个c函数,该函数给出一个字节中被置为1的位的个数#includeint count_1(int num){ int i; int count = 0; unsigned int mask = 1; for(i = 0; i < 32; i++) {原创 2016-07-16 15:46:59 · 389 阅读 · 0 评论 -
C学习笔记(四)复杂的变量声明 左右法则
曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明。 我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的“右左法则”。 需要强调一下的是,复杂的C/C++声明并不是好的编程风格;转载 2016-07-11 15:25:24 · 455 阅读 · 0 评论 -
C学习笔记(十一)数组认知
一.一维数组1.1定义初始化遍历整型数组字符数组 1.2数组名的作用(指针常量) 数组首元素的地址1.2.1 array 与& array 的区别&a 对一维数组的数组名取地址等于数组的地址*(&a) 对一维数组的地址取值等于数组首元素的地址1.2.2数组指针数组指针定义与初始化 数组指针是一个指针变量,这指针指向一个数组int (*pa)[原创 2016-07-20 19:53:40 · 255 阅读 · 0 评论 -
Trianing 4 字符串训练
字符串练习1.请编写一个C函数,该函数将一个字符串逆序2.请编写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出 3.输入一个字符串,计算字符串中子串出现的次数4编写一个C函数,将“”I amshanghai“倒置为“shanghai from am I”,及将句子中的单词位置倒置,而不改变单词内部结构.5.输入一个字符串,同时输入帧头和帧尾(可以是原创 2016-08-16 13:28:39 · 489 阅读 · 0 评论 -
C学习笔记(十二)函数详解
函数 函数,迭代开发,封装成函数,有利于代码的复用性和维护性要求:内部要尽量少的调用,函数要有独立性 函数调用进行的操作①通过函数名找到函数入口地址②给形参分配内存空间③传值:把实参变量对应空间的值传给形参④执行函数体里的语句 一.函数三要素:1.函数名:动词 + 名词 下滑线连接的字符不要超过5个自注释性(提高代码的可读性)、2.形参原创 2016-07-20 20:41:25 · 323 阅读 · 0 评论 -
C练习(五)
标题: 黄金连分数 黄金分割数0.61803...是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。 对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!! 言归正传,我们原创 2016-11-21 18:04:39 · 308 阅读 · 0 评论 -
C练习(六)
标题:错误票据某涉密单位下发了某种票据。并要在年终所有收回。每张票据有唯一的ID号。全年全部票据的ID号是连续的。但ID的開始数码是随机选定的。由于工作人员疏忽。在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。如果断号不可能发生在最大和最小号。原创 2016-12-01 21:43:13 · 382 阅读 · 0 评论 -
C练习(四)
1.标题: 马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。 有一次,老师出的题目是:36x 495 = ? 他却给抄成了:396 x45 = ? 但结果却很戏剧性,他的答案竟然是对的!! 因为 36 * 495 =396 * 45 = 17820 类似这样的巧合情况可能还有很多,比如:27 * 594 = 29原创 2016-11-17 14:51:31 · 321 阅读 · 0 评论 -
C练习(三)
C练习 1.实现Fibonacci数列算法unsigned longFib(int n){ if (n return n; } else { return F(n - 1) + F(n - 2); }}递归实现斐波纳契数列,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)(重复运算,算原创 2016-11-17 00:33:21 · 306 阅读 · 0 评论