C
ZHANGJIETING
这个作者很懒,什么都没留下…
展开
-
指针常量与常量指针(转)
int b = 500; const int* a = & [1] int const *a = & [2] int* const a = & [3] const int* const a = & [4] 如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的原创 2009-02-12 18:32:00 · 450 阅读 · 0 评论 -
段错误的第7种情况——指向静态存储区的指针
#include #include int main(){ char *p = "he llo"; strtok(p," "); return 0;}上面这个程序运行会出现段错误,我认为是p指针没有在堆中分配内存空间的原因,程序中只让p指向静态存储区存储的字符串“he llo”了,可能是strtok不能操作静态存储区数据的缘故吧。。。原创 2010-09-17 17:18:00 · 1014 阅读 · 0 评论 -
段错误的第5种情况——使用空指针
<br />int main(){ char *p = NULL; printf("%s/n",p); return 0;}<br /> <br />使用空指针会出现段错误,要想给字符型指针进行初始化,使用时还不会出现段错误,要像下面这样写:<br />int main(){ char *p = ""; printf("%s/n",p); return 0;}原创 2010-09-16 17:09:00 · 1778 阅读 · 1 评论 -
绝对不能通过指针修改常量!!!!!!
绝对不能通过指针修改常量!!!!!!原创 2010-09-17 17:27:00 · 700 阅读 · 0 评论 -
段错误的第8种情况——用双引号来括字符
<br />错误代码段:int n = 0;while(array[n] != "=") //已知字符串array中一定有“=”这个字符{ n++;}正解:int n = 0;while(array[n] != ‘=’) //已知字符串array中一定有“=”这个字符{ n++;}原创 2010-09-21 14:00:00 · 741 阅读 · 0 评论 -
段错误的第9种情况——printf函数中的格式符将%d写成%s
<br />错误代码: time_t timep; int seconds = time(&timep); printf("%s/n",seconds);正确代码: time_t timep; int seconds = time(&timep); printf("%d/n",seconds);<br />上面这种情况也会出现段错误,仔细想想,和指针多少也有点关系,因为%s这个格式符就是伴随指针用的,而后面是变量不是原创 2010-09-21 17:32:00 · 1589 阅读 · 0 评论 -
google2011选择题
<br />今天晚上Google的2011年校园招聘宣讲会分别在北大和清华举行,其中北大本来是350<br />人的会场,去了大约600多人,爆满,那场面绝对是人山人海,彩旗飘飘。经过了大约<br />一个小时多的宣讲和问答,开始现场笔试环节,一共10个选择题和三个算法题,只有选<br />择题答对了6个以上的人才有机会让面试官看你后面的算法题。然后明天下午会通知笔<br />试通过的人进行面试,Google的效率就像其搜索引擎一样迅速,效率可见一般。<br /><br />其中前10个转载 2010-10-09 16:49:00 · 800 阅读 · 0 评论 -
'/0'的ASCII码
<br />#include<iostream> using namespace std; void main() { char c = '/0'; cout<<(int)c<<endl;} <br /> <br />输出结果为:<br />0<br /> <br />说明'/0'的ASCII码为0。原创 2010-10-12 23:25:00 · 2931 阅读 · 0 评论 -
类的大小问题
#include using namespace std;class A{};class B{ char array[0];};class C{ char array[1];};class D{ char array[2];};int main(int argc, char *argv[]){ A a; B b; C c; D d; cout运行结果:1012原创 2010-10-12 10:42:00 · 482 阅读 · 0 评论 -
不用sizeof来求出int的大小(程序)
<br />#include <stdio.h>int main(int argc, char *argv[]){ int a[2]; unsigned int add1 = &a[0]; unsigned int add2 = &a[1]; printf("The address of a[0] is %u/n",add1); printf("The address of a[1] is %u/n",add2); printf("The size of int is %u/原创 2010-10-12 09:57:00 · 1359 阅读 · 0 评论 -
求32位机器上unsigned int的最大值及int的最大值
#include int main(int argc, char *argv[]){ unsigned int max_int = (1编译后:int_sizeof1.c: 在函数‘main’中:int_sizeof1.c:5: 警告:整数溢出运行后:The max value of int on 32 machine: 2147483647原创 2010-10-12 10:09:00 · 40221 阅读 · 0 评论 -
关于switch语句的进一步理解
<br />程序1:<br />int main(){ char s[] = "1234111234"; int v1=0,v2=0,v3=0,v4=0; int i; for(i=0;i<strlen(s);i++){ switch(s[i]){ default:v4++; case '1':v1++; case '2':v2++; case '3':v3++; } } printf("v1=%d, v2=%d, v3=%d, v4=%d/n原创 2010-10-14 10:40:00 · 725 阅读 · 0 评论 -
ftell函数的使用
<br />功 能: 返回当前文件指针<br /> <br />调用示例:<br />ftell(fp);利用函数 ftell() 也能方便地知道一个文件的长。如以下语句序列: fseek(fp, 0L,SEEK_END);len =ftell(fp);首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。原创 2010-10-14 11:13:00 · 2170 阅读 · 0 评论 -
对于字符串"121134sKDGU554",求原字符串的数字个数。并将重复字母去掉,输出新的字符串。
#include <stdio.h>#include <string.h>int main(int argc, char *argv[]){ char str[] = "121134sKDGU554"; int i, j, k, L = strlen(str), count = 0; for(i=0; i<L;i++){ if(str[i]>='0' && str[i]<='9'){原创 2010-10-14 13:22:00 · 943 阅读 · 0 评论 -
原码、反码、补码的进一步理解
<br />原码:<br />人类数字二进制表示。<br /> <br />反码:<br />原码到补码的过度,没有任何作用。<br /> <br /><br />补码:<br />计算机内部数字表示。<br />计算机用补码表示的原因:<br /> 1、可以将符号位与其他位统一处理;<br /> 2、减法可以按加法处理。<br />注:<br /> 1、补码相加,如果最高位(符号位)有进位,则进位被舍弃;<br /> 2、补码、原码转换过程相同(除符原创 2010-10-20 16:05:00 · 783 阅读 · 1 评论 -
求素数
<br />#include <stdio.h>#include <math.h>int isPrime(int n){ int i; for(i=2; i<=sqrt((double)n); i++) if(n%i==0) return 1; return 0;}int main(int argc, char *argv[]){ int i,j; for(i=2;i<100;i++){ j = isPri原创 2010-10-20 16:19:00 · 515 阅读 · 0 评论 -
指针类型转换(非常棒非常全的一篇文章)
<br />原文地址:http://hi.baidu.com/sunkanghome/blog/item/3cae5e0379d8417e3912bbfa.html<br /> <br /> <br />1、强制类型转换<br />看一下这个c代码:<br />int a = 0x123456; //0x是十六进制的表示法<br />char c = (char)a;<br />printf("%x/n", c);<br />在我的编译环境里输出的是什么呢? 是56,怎么得来的呢?<br转载 2010-10-20 11:16:00 · 2809 阅读 · 1 评论 -
取内存地址为0x10000的内容(程序)
<br />#include <stdio.h>int main(int argc, char *argv[]){ char *p = (char *)0x10000; printf("%d/n",*p);}<br />一定要用强制类型转换,否则会出错。原创 2010-10-20 23:06:00 · 1348 阅读 · 0 评论 -
XML解析器——expat相关文章
<br />http://www.xml.com/pub/a/1999/09/expat/index.html 相对官方一点的<br /> <br /> <br />http://blog.csdn.net/jjyyhema/archive/2010/02/02/5279915.aspx 一个牛人写的解析器<br /> <br /> <br />http://bbs.chinaunix.net/thread-1576628-1-1.html<br />http://topic.csdn.net/u/2原创 2010-09-07 11:37:00 · 756 阅读 · 0 评论 -
段错误的第6种情况——与指针无关
1 #include 2 3 void a() 4 { 5 int i = 0; 6 i++; 7 if(i == 2) 8 return; 9 else 10 a(); 11 } 12 13 int main() 14 { 15 a(); 16 }原创 2010-09-16 17:16:00 · 597 阅读 · 0 评论 -
volatile修饰符的作用
直接去内存取,不会把该变量放到寄存器,避免内存和寄存器不同步原创 2009-09-23 22:12:00 · 534 阅读 · 0 评论 -
总线错误和段错误原因
总线错误引起原因: 几乎总是由于对未对齐的读或写引起的。它之所以称为总线错误是因为对未对齐的内存访问时,被阻塞的组件就是地址总线。 段错误引起原因:引起直接原因:(1)解除引用一个包含非法值的指针。(2)解除引用一个空指针(常常是从系统返回,却未经过检查)。(3)未得到正确权限进行访问。如:向只读文本段存储值就回引起段错误。(4)用完了堆栈或堆空间。 出现频率原创 2009-09-23 22:27:00 · 2449 阅读 · 0 评论 -
sprintf() 格式化输出函数
<br />sprintf() 格式化输出函数(图形)<br />功能: 函数sprintf()用来作格式化的输出。<br />用法: 此函数调用方式为int sprintf(char *string,char *format,arg_list);<br />说明: 函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组),然后再调用outtextxy()函数将串里的字符显示在屏幕上。arg_list为参数表,可有不定原创 2010-06-30 08:52:00 · 778 阅读 · 0 评论 -
通过strstr函数来深入理解逐个给字符数组赋值和用字符串给字符数组赋值的区别
#include #include int main(){// char array[] = "dagaga diiab";// char str[] = "aw"; char array[5] = {d,a,w,s,/0}; char str[3] = {a,w,/0}; // char *array = "da原创 2010-05-28 12:26:00 · 2066 阅读 · 0 评论 -
发现scanf竟然可以用正则表达式,哈哈
}#include int main(){ char array[10] = {0}; //这个地方必须用0初始化,ASCII码为0代表空 scanf("%[a-zA-Z0-9]",array); for(int i=0;i原创 2010-05-31 16:47:00 · 890 阅读 · 0 评论 -
最近发现指针可以指向内存中的任何位置
int array;int *p = &array; //这个指针指向栈区,如果array是全局变量,这个指针就指向全局(静态)区char *p = "hello"; //这个指针指向常量区int *p = (int*)malloc(sizeof(int)); //这个指针指向堆区int (*fn)(int a); //这个指针指向代码区 对于指向常原创 2010-05-28 19:25:00 · 2413 阅读 · 0 评论 -
c c++中 #define用法总结
<br />本质:替换功能,你define所有的东西在编译的时候会执行替换动作。<br />不论写c或者c++,对#define可能是最熟悉的了 ,下面列举其他用法:<br />1.简单的#define定义“全局变量”<br />2.define的“函数定义”<br />3。宏的单行定义<br />4。取消宏#undef<br />5。为了避免重复包含(重复定义), 在一个.h文件开头会使用 #define ×××来定义。原创 2010-07-27 16:04:00 · 849 阅读 · 0 评论 -
可变参数宏
<br />http://www.upsdn.net/html/2006-08/692.html原创 2010-07-27 16:20:00 · 505 阅读 · 0 评论 -
关于初始化的理解
1、对于局部变量来说,如果不初始化,里面的值是随机的;2、对于全局变量和静态变量来说,不初始化,编译器会自动将其赋值为0;3、对于指针来说,不初始化,就是一个野指针,随意指向一个地方,我们也不知道它指向哪里,所以是不安全的,如果不给指针分配指向的空间或者说赋值,那就初始化为NULL;4、对于指针数组,因为它是一个数组,编译器自动分配空间,但是分配的是存放指针的数组的空间,对于里面存放的指针,如果没有给其赋值,那他们也是不安全的,所以要初始化为NULL;例:int *HT[N];for(int i=0原创 2010-06-04 10:55:00 · 1281 阅读 · 0 评论 -
16位的机器,两个128位的数相加(数组方法)
#include int main(){ int num1[8] = {0x1234,0x1234,0x1234,0x1234,0x1234,0x1234,0x1234,0x1234}; int num2[8] = {0x5678,0x5678,0x5678,0x5678,0x5678,0x5678,0x5678,0x5678}; int num3[8]; for(int i=0;i原创 2010-06-06 14:16:00 · 1154 阅读 · 0 评论 -
关于类型和强制类型转换的理解
#include using namespace std;int main(){ char ch1 = 'Y'; int ch2 = 2; char *pch1 = &ch1; int *pch2 = &ch2; int a = 1; double b = 2.2; void *pch3 = &ch1;// void c; //非法 cout1、void其实是一种用于语法性的类型,而不是数据类型,主要用于作为函数的参数或返回值,或者定义void指针原创 2010-06-03 20:44:00 · 722 阅读 · 0 评论 -
C语言中的两种hash表的实现
1、用数组#include #define N 4typedef int datatype;typedef struct{ datatype key;}Hretype;int LHashsearch(Hretype HT[N], datatype k){ int addr,i=0; addr = k % N; while(i原创 2010-06-04 11:38:00 · 6691 阅读 · 0 评论 -
输出64位数的方法
#include int main(){ __int64 a = 0x1234567890; printf("%I64x/n",a); //输出64位的数用I64。是大写的i。 return 0;}原创 2010-06-09 15:22:00 · 740 阅读 · 0 评论 -
i++和++i问题
#include #define N(i) ++i + ++i#define M(i) i++ + i++int main(){ int i=3; int j = ++i + ++i; i = 3; int k = N(i); printf("%d/n",j); printf("%d/n",k); i = 3; j = i++ + i++; i=3; k = M(i); printf("%d/n",j); pri原创 2010-06-10 15:29:00 · 599 阅读 · 0 评论 -
动态库的生成与对.so的读取(转)
<br />http://blog.csdn.net/wyl123/archive/2008/12/10/3486124.aspx<br /> <br /> <br />test.h<br />#ifndef _TEST_H<br />#define _TEST_H<br />void test_a();<br />void test_b();<br />#endif<br />test_a.c<br />#include <stdio.h><br />#include "test.h"<br />void转载 2010-08-10 16:12:00 · 610 阅读 · 0 评论 -
memset作用
初始化新申请的一块内存。原创 2010-09-01 15:24:00 · 710 阅读 · 0 评论 -
段错误的第4种情况——没有返回指针
STREE *create_tree(){ printf("tree/n"); return NULL; //如果没有出现这句,就会出现段错误}所以,段错误归根结底还是指针问题。原创 2010-09-16 16:44:00 · 692 阅读 · 0 评论 -
关于全局变量、静态全局变量、静态局部变量的区别与联系
<br />简单的说用法: <br />几个C文件都用到, 则全局 <br />只本C文件用到,且好几个函数用到, 则静态(所谓全局静态) <br />只本函数用到, 而又不想在函数退出时被释放掉(所谓值还保留着), 则局部静态 <br /> <br /> <br />我的理解:<br />上面三种变量都保存在全局(静态)区,所以在程序执行的过程中,它是一只存在的。区别就是对作用域范围的限定。全局的都能用到,全局静态的被限制在本文件内,局部静态的被限制在本函数内。原创 2010-10-22 23:26:00 · 667 阅读 · 0 评论