随笔分类 - C-基础
摘要:char* &p:以引用传递的方式传指针char* p: 以值传递的方式传指针
阅读全文
摘要:为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用,就是方便程序段的定义和修改。 1.关于预定义替代#define Conn(x,y) x##y#define ToChar(x) #@x#define ToString(x) #x#表示x连接y:int n = Conn(123,456); 结果是n=123456;char* str = Conn("asdf", "adf")结果是 str = "asdfadf";#@x,其实就是给x加上单引号,结果返回是一个const char:char a = ToChar(1
阅读全文
摘要:指出下面代码的输出,并解释为什么。(不错,对地址掌握的深入挖潜)main(){ int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1));}输出:2,5 *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5,&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int),所以,int *ptr=(int *)(&a+1);ptr实际是&(a[5]),也就是a+5原因如下:&a是数组指针
阅读全文
摘要:一,原型void * memcpy ( void * destination, const void * source, size_t num );功能:将以source作为起始地址的数据复制num个字节到以destination为起始地址的数据中,不支持destination和source重叠的情况。函数返回destination指针。void* memcpy (void* destination,constvoid* source,size_t num ){ char* pdes =(char*)destination; char* psrc =(char*)source; asse...
阅读全文
摘要:这是没有引入任何头文件时,如果使用"NULL",编译器会报错:没有定义NULL。此时可用下面代码定义。#undef NULL //#undef 是在后面取消以前定义的宏定义#if defined(__cplusplus) //区别于#ifdef,#if defined的意思是如果在编译这几行之前,已经定义过(&& || && ||)等标识符#define NULL 0 //#define是预处理宏定义命令#else#define NULL ((void *)0)//NULL ((void*)0) C中的“标准”写法,NULL被替换为一个voi
阅读全文
摘要://这段代码运行有可能不报错。static char a[10]; for (int i=0;i<90;i++){ a[i]=i;}1、为了提高运行效率,不检查数组下表越界,程序就可以跑得快。因为C语言并不是一个快速开发语言,它要求开发人员保证所有逻辑的正确性。所以至少到目前为止,C语言是所有高级语言中速度最快,效率最高的。几乎所有对性能有苛刻要求的场合都使用C语言。2、不检查下标是为了给程序员更大的空间,也为指针操作带来更多的方便。如果有这个检查的话指针的功能将会大大被削弱,C的数组标识符,里面并没有包含该数组长度的信息,只包含地址信息,所以语言本身无法检查,只能通过编译器检查,而早期
阅读全文
摘要:一般的来说,函数是可以返回局部变量的。局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明:1:#include char *returnStr() { char ...
阅读全文
摘要:#include #include //---------------------------------------------------------------------------main(){ ofstream ofile("d:\\write.txt"); if(!ofile) return; ifstream ifile("d:\\read.txt"); if(!ifile) return; char a[20]; int i=0; while(!ifile.eof()) { ifile>>a[i]; if (a[i] ==
阅读全文
摘要:sizeof和strlen (string.h)先看几个例子(sizeof和strlen之间的区别):(1)对于一个指针, char* ss ="0123456789"; sizeof(ss)为4, ss是指向字符串常量的字符指针 strlen(*ss)为1,*ss是第一个字符(2) 对于一个未定义长度的数组名, char ss[] = "0123456789"; sizeof(ss)为11, ss是数组,计算到'\0'的位置,因此是(10+1) ,返回完整的内存长度。 sizeof(*ss)为1,*ss是第一个字符(3) 对于已经定义了
阅读全文
摘要:1 void foo(void) 2 3 { 4 5 unsigned int a = 6; 6 7 int b = -20; 8 9 (a+b > 6) puts("> 6") : puts("6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。
阅读全文
摘要:C语言库函数名: atoi功 能: 把字符串转换成整型数。名字来源:ASCII to integer 的缩写。原型: int atoi(const char *nptr);函数说明: 参数nptr字符串,如果第一个非空格字符存在,并且,如果不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。头文件: #include stdlib.h>程序例:1) 1 #include 2 #include 3 int main(void) 4 { 5 int n; 6 char *str = "12345.67"; 7
阅读全文

浙公网安备 33010602011771号