c语言函数

聊一聊C语言的参数传递

限于喜欢 提交于 2019-12-10 04:30:41
本讲我们和大家一起来聊一聊C语言中有关参数传递的一些知识。 1. 问题引入 请写出以下程序的打印结果。 #include <stdio.h> // 将某整数加10 void add_by_10(int a){ a = a + 10; } int main(int argc, char *argv[]){ int a = 2; add_by_10(a); printf("a= %d\n", a); } 上面的程序非常的简单,我们定义了一个函数add_by_10,它的功能是实现整数加10,然后在main函数中调用,由于a初始值为2,当调用函数了以后,a的值变成了12。 事实真是如此吗?如果你编译执行了这段程序,你会发现打印的结果是: "a = 2" . 为什么会这样呢?这和你想的完全不一样。 2. 问题分析 接下来我们就和大家一起来分析为什么会是这样的结果。 之前的文章我们讲过,所谓变量的定义其实就是从4G的内存条上去拿空间,如你定义了一个int a;其本质含义就是要从你新买的4G内存条上拿走一块4字节大小的空间,如下所示,黄色部分的空间就是属于a的,其他人不能用哈。 我们再将该问题深入一些,其实系统在分配内存时,是以函数为基本单元,如问题1中定义的程序,我们有两个函数main和add_by_10,所以系统会先分别给这两个函数分配内存

c语言常用函数strcmp函数和strcpy函数

跟風遠走 提交于 2019-12-09 11:37:48
(一)strcmp函数 strcmp函数是比较两个字符串的大小,返回比较的结果。一般形式是: i=strcmp(字符串,字符串); 其中,字符串1、字符串2均可为字符串常量或变量;i 是用于存放比较结果的整型变量。比较结果是这样规定的: ①字符串1小于字符串2,strcmp函数返回一个负值; ②字符串1等于字符串2,strcmp函数返回零; ③字符串1大于字符串2,strcmp函数返回一个正值;那么,字符中的大小是如何比较的呢?来看一个例子。 实际上,字符串的比较是比较字符串中各对字符的ASCII码。首先比较两个串的第一个字符,若不相等,则停止比较并得出大于或小于的结果;如果相等就接着 比较第二个字符然后第三个字符等等。如果两上字符串前面的字符一直相等,像"disk"和"disks" 那样, 前四个字符都一样, 然后比较第 五个字符, 前一个字符串"disk"只剩下结束符'/0',后一个字符串"disks"剩下's','/0'的ASCII码小于's'的ASCII 码,所以得出了结果。因此无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。 注意:字符串是数组类型而非简单类型,不能用关系运算进行大小比较。 if("ABC">"DEF") /*错误的字符串比较*/ if(strcmp("ABC","DEF") /*正确的字符串比较*/

对c语言中static函数的理解

时光毁灭记忆、已成空白 提交于 2019-12-08 23:40:32
  先看看前两篇博客: 个人对头文件的理解 、 对声明和定义的理解 。     static 函数只在定义该static函数的cpp中可见,在其他cpp中是不可见的。    举个例子,我建立了一个project,该project中有三个文件,一个头文件,和两个cpp文件。文件内容如下:   在build该project时会出错,错误提示是fun()函数声明了却未定义。   为什么编译器没有找到fun()函数的定义呢?我明明在Source.cpp中定义了fun()函数呀。   原因很简单:static函数的 作用域很小 , 只在本 cpp 中有效 , 而非 在整个project中都有效。所以在main.cpp中无法找到fun()函数的定义。   根据此特性,我们可以进行一些看似行不通的操作,比如下面这个:   咦,居然build成功了,这是为啥?我之前明明说过每个函数至多只能定义一次,这儿明明定义了“两次”。   我们先来看看最后输出的结果是啥?是“hello“还是”world“?   答案是“world“,即main()函数中所使用的fun()函数采用的是在main.cpp中fun()函数的定义。   根据刚才的结论,由于static函数的作用域只在本cpp中,因此Source.cpp和main.cpp中的fun()函数的作用域并没有冲突。之前所说的函数至多只能被定义一次

C语言内存操作函数的实现

泪湿孤枕 提交于 2019-12-08 17:23:02
>memcpy: void *memcpy(void *dest,const void *source,size_t num); (1)函数memcpy从source的位置开始向后复制num个字节的数据到dest的内存位置。 (2)这个函数在遇到'\0'的时候并不会停下来。 (3)如果source和dest有任何的重叠,复制的结果都是未定义的。 void *my_memcpy(void *dest, const void *str, int size) { assert(dest); assert(str); assert(size > 0); while (size--){ *(char *)dest = *(char *)str; (char *)dest = (char *)dest + 1; (char *)str = (char *)str + 1; } return dest; } 适用于dest>source,如果dest<source就会内存从叠问题,从前往后拷贝时前一个会把后一个覆盖num个字节。这时就需要用到memmove。 >memmove: void *memmove (void *dest,const char *str,int size); (1)和memmove的差别就是memmove函数处理的源内存块的目标内存块是可以重叠的。 (2

C语言memcmp()函数:比较内存前n个字节

蹲街弑〆低调 提交于 2019-12-08 17:22:31
头文件:#include <string.h> 定义函数:int memcmp (const void *s1, const void *s2, size_t n); 函数说明:memcmp()用来比较s1 和s2 所指的内存区间前n 个字符。 字符串大小的比较是以ASCII 码表上的顺序来决定,次顺序亦为字符的值。memcmp()首先将s1 第一个字符值减去s2 第一个字符的值,若差为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如,字符串"Ac"和"ba"比较则会返回字符'A'(65)和'b'(98)的差值(-33)。 返回值:若参数s1 和s2 所指的内存内容都完全相同则返回0 值。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。 范例 #include <string.h> main () { char * a = "aBcDeF" ; char * b = "AbCdEf" ; char * c = "aacdef" ; char * d = "aBcDeF" ; printf ( "memcmp(a, b):%d \n " , memcmp (( void *) a , ( void *) b , 6 )); printf ( "memcmp(a, c):%d \n " , memcmp (( void *) a , ( void

C语言函数_string.h 之 内存comparison函数memcmp

拟墨画扇 提交于 2019-12-08 17:21:54
memcmp 原型: int memcmp(const void *ptr1, const void*ptr2, unsigned int count); 功能: memcmp用于比较内存区域ptr1和ptr2的前count个字节,是按字节进行比较的。 头文件: string.h 或 memory.h 返回值: < 0 :ptr1和ptr2所指内存中第一个不相等的字节有*((char*)ptr1+x) < * ((char*)ptr2+x) > 0 :ptr1和ptr2所指内存中第一个不相等的字节有*((char*)ptr1+x) > * ((char*)ptr2+x) = 0 :ptr1和ptr2所指的内存块中前count个字节都相等 说明: 1、函数的返回条件是:比较次数达count次或者*((char*)ptr1+x) - *((char*)ptr2+x)的值不 为零(即两个块内存中第x字节不相等)。 2、函数是按字节进行比较的,如果还没有达到上述返回条件,即使遇到'\0'也不会停止比较。 而判断规则是按照ASCII码表中字母的顺序进行比较的,即'a'的值为97,'A'的值为65,因此'a' 比'A'大。 3、调用函数时如果参数为结构体,则需要确保结构体中的填充字节被清零。例子: typedef struct memcmp_test { short data1; int

C语言之memcmp()函数

大兔子大兔子 提交于 2019-12-08 17:21:27
memcmp函数是用于比较字符串的,比较内存前N个字节; 该函数在头文件<string.h>中,函数定义为:int memcmp (const void *s1, const void *s2, size_t n); 字符串大小的比较是以ASCII 码表上的顺序来决定,次顺序亦为字符的值。memcmp()首先将s1 第一个字符值减去s2 第一个字符的值,若差为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如,字符串"Ab"和"ba"比较则会返回字符'A'(65)和'b'(98)的差值(-33)。 返回值:两个字符串内容完全一样,返回0;若S1大于S2,则大于0,反之则小于0; 下面个是别人的范例: #include <string.h> main(){ char *a = "aBcDeF"; char *b = "AbCdEf"; char *c = "aacdef"; char *d = "aBcDeF"; printf("memcmp(a, b):%d\n", memcmp((void*)a, (void*)b, 6)); printf("memcmp(a, c):%d\n", memcmp((void*)a, (void*)c, 6)); printf("memcmp(a, d):%d\n", memcmp((void*)a, (void*)d, 6)); }

C语言之memcmp函数

时光怂恿深爱的人放手 提交于 2019-12-08 17:16:54
【FROM MSDN && 百科】 原型:   int memcmp(const void *buf1, const void *buf2, unsigned int count); #include<string.h> 比较内存区域buf1和buf2的前count个字节。此函数是按字节比较。 Compares the first num bytes of the block of memory pointed by ptr1 to the first num bytes pointed by ptr2, returning zero if they all match or a value different from zero representing which is greater if they do not。 Notice that, unlike strcmp , the function does not stop comparing after finding a null character. 对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元, 如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。 DEMO: //#define

Windows下C语言实现 hello/hi 多线程网络聊天程序以及代码分析

早过忘川 提交于 2019-12-08 13:19:32
一、编译环境   系统:Windows 10  软件:CodeBlocks 17.12 二、完整代码 server: 1 #include <stdio.h> 2 #include <windows.h> 3 #include <Winsock2.h> 4 #include <string.h> 5 #include <pthread.h> 6 7 #pragma comment("ws2_32.lib") 8 9 struct mes{ 10 SOCKET clisock; 11 SOCKADDR_IN cliaddr; 12 }; 13 14 void* thread_new(void *); 15 16 int main() 17 { 18 WORD wVersionRequested; 19 WSADATA wsaData; 20 wVersionRequested = MAKEWORD(2,2); 21 if(WSAStartup(wVersionRequested, &wsaData) != 0) 22 { 23 printf("WSAStarup Failed!\n");//初始化错误 24 exit(-1); 25 } 26 if(wsaData.wVersion != wVersionRequested) 27 { 28 printf("The version

C语言-----模拟实现内存操作函数(memset、memcpy、memmove、memcmp、memchr)

落爺英雄遲暮 提交于 2019-12-07 09:19:12
之前实现过一些 字符串操作函数 ,在C标准库中还有一些操作内存的函数 1、 memset 这个函数是用来设置内存内容的,平时我们可以利用它来初始化一段连续空间。 要注意的是这个函数的后两个参数,第二个参数是int,但是具体使用的时候用的是char类型,第三个参数是你要设置内存的大小,以字节为单位。 void * my_memset( void * buf, int value , size_t num) { char * su = ( char *)buf; char ch = value ; for ( int i = num; i > 0 ; --i) { *su = ch; su++; } return buf; } 2、 memcpy 这个函数是用来拷贝内存内容的函数,用来拷贝src所指的内存内容前n个字节到dest所指的内存上,它不像strcpy一样,遇到’\0’就停止拷贝,它会复制完n个字节 注:dest和src所指的内存区域不可重叠 void * my_memcpy( void * dest, void * src, size_t n) { void * res = dest; while (n--) { *( char *)dest = *( char *)src; dest = ( char *)dest + 1 ; src = ( char *)src + 1