C语言基础掌握之day3

原码:将最高位作为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值。
反码:一个数如果值为正,那么反码和原码相同。如果值为负,那么符号位为1不变,其它各位与原码相反。
补码:正数的原码、反码、补码都相同。负数,最高位符号位为1不变,其余各位取反,最后+1。计算机存放数据都是按照补码的形式放,然后进行计算的。

1.数组

定义:内存连续,并且是用一种数据类型的变量
类型 数组名[];
在内存当中是连续的空间地址
数组初始化:类型 数组名[N]={0};表示N个元素都初始化为0。
二维数组定义:int array[3][4];
二维数组初始化:int array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
字符串数组定义:char array[100];
对C语言字符串就是最后一个元素以'\0'结尾的数组。
字符串初数组始化:char array[]="hello";

scanf函数不安全提醒:主要是scanf函数没有解决缓冲区溢出的问题和不能成功获取完整的含空格的字符串,我们可以添加一个宏定义#define _CRT_SECURE_NO_WARNINGS或#pragma warning(disable:4996)
我们也可以用gets函数来获取一个含空格的字符串。
我们也可以用fgets函数来获取一个含空格的字符串并解决缓冲区溢出的问题,用法fgets(字符串数组名,sizeof(字符串数组名),stdin);stdin表示标准输入。fgets函数最后会自动补上'\n'
puts函数:打印字符串,与printf不同,puts函数会在最后自动添加一个‘\n‘。
fputs函数用法:fputs(字符串数组名,stdout);与puts函数区别是它不会在最后加上\n
strlen函数求字符串长度。不会将最后的\0也计算在内。
strcat(a,b);把b追加到a的后面。a必须要有足够的空间。
当a的缓冲区空间较小,b很大的时候,strcat也面临安全问题,所以要用strncat函数,用法:strncat(a,b,sizeof(a)-strlen(a)-1);这样就不会有溢出了。
memset(a,0,sizeof(a));将a内存初始化为0;
strcmp(a,"str");表示如果两个参数所指的字符串内容相同,函数返回0。
strncmp(a,"exit",4);4表示只比较前4位。
strcpy(b,a);表示将a拷贝到b。
strncpy:有限拷贝。
sprintf(a,"ni shi shui%d",3)表示将ni shi shui3输入到字符串数组a中。
strchr(a,'c'):表示在字符数组a查找字符'c',返回一个指针且指向字符‘c’的位置
strstr(a,"345"):表示在字符数组a查找字符串“345”。返回一个指针且指向字符串“345”的首地址。
strtok(a,"¥"):表示以¥为结束符,返回指向前面的字符串或字符的首地址或地址的指针。
atoi(a)函数表示将字符串a转化为整数。atof、atol都是一样的。

3.函数

在定义函数时,函数名后面括弧中的变量名称为形式参数,简称形参。在调用函数时,函数后面括号中的变量或表达式称为实际参数,简称实参。
形参在未出现函数调用时,它们并不占用内存单元,只有发生函数调用的时候形参才被分配内存,函数调用完成后,形参所占的内存被释放。
实参可以是变量、常量、表达式。
在定义函数时,一定要指定形参和实参的数据类型。
形参和实参的数据类型一定要可兼容。
在C语言中,实参和形参的数据传递是单向值传递,只由实参传递给形参,而不能由形参传递给实参。
return语句后面的语句不会被执行。
exit(0)函数表示退出程序。
头文件的使用:函数原型放在头文件里,就不用在使用函数的时候去声明该函数了,直接将放置函数原型的头文件预编译即可。使用头文件需要#include,定义头文件需要#ifndef与#endif。
函数的封装:如果放在.c文件就是代码级的封装,如果放在.dll就是二进制的封装。
动态库.dll的特点:程序运行会自动加载dll文件,且dll文件可以被多个程序调用。
静态库的特点:程序直接编译静态库,编译完成后就不需要静态库的文件了,因为已经包含在程序内部了,这样一来程序所占的内存会变大,且如果静态库的功能发生变化,就需要重新编译程序了。


linux下的动态库so文件封装示例:
新建一个a.c文件:

输入gcc -c a.c -fPIC -o a.o表示编译a.c文件,与位置无关,输出a.o文件

输入gcc -shared -o liba.so a.o表示编译一个有关a.o二进制文件的共享库

-fPIC的意思是生成一个与位置无关的代码。主要是因为每个程序都有一个入口地址(系统根据实际情况动态分配的),程序内部调用的函数距离该入口地址有一段距离叫做偏移地址,但是动态库编译的时候不知道偏移地址是多少,主要取决与哪个程序调用它,所以要指定-fPIC生成一个与位置无关的代码。
gcc链接的时候要加-shared选项,意思是生成一个so共享库。
对于linux或Unix,一个so文件,文件扩展名必须是so,文件名的前三个字母必须是lib。
要用到这个动态库文件so,需要新建一个头文件来声明动态库文件so里面的函数。输入vi a.h

#ifndef __AH表示如果没有定义一个__AH,就定义一个__AH,#define __AH表示定义一个__AH。

输入vi main.c表示编写一个可执行文件,来调用库文件.so。

输入gcc -c main.c -o main.o表示只编译不链接,指定输出文件名称为main.o
输入gcc -o main.out main.o -L. -la表示链接main.o文件,指定输出main.out可执行文件,并且在当前目录下寻找-la文件(代表liba,so文件)。

linux不再当前目录下寻找可执行程序,同时也不在当前目录下找so库文件,解决办法——修改用户配置文件:第一:cd(返回主目录);第二vi .bash_profile;第三:添加export LD_LIBRARY_PATH=$LD_LINRARY_PATH:.;第四:wq;第五:生效. .bash_profile 

然后因为linux不再当前目录下寻找可执行文件,所以我们要进入main.out,如,我在1文件中存放main.out可执行文件,所以我要进入cd 1,然后输入./main.out表示在当前目录下执行main.out文件

VS2013下的代码封装

打开VS2013,新建项目,选择Win32应用程序导向

下一步

选择dll,点完成。

添加新建项.cpp文件,在里面写代码,实现判断两个数的大小的功能,编写完编译一下

寻找自己存储VS项目文件处,找到编译好的mydll.dll文件,该文件就是我们封装好的,供其它程序加载调用的动态库文件

那么dll文件怎么用呢?我们知道封装的代码功能是判断两个数的大小,这时候,我们就要新建一个项目,并且添加新建项,编写代码,一个程序的入口main。编译一下。

并将封装好的.dll文件复制到我们新建项目usedll中和可执行文件一起,并将.lib库文件放到usedll项目文件中和.c文件一起

这时候,需要一个头文件,来声明我们封装的函数和我们所需要用到的库文件,代码:#pragma comment(lib,"mydll.lib")。

成功实现封装代码的功能

dll文件封装起来,主要是给第三方使用的,这样别人就不会看到里面的代码,而且dll可以被多个程序调用,可以被其它高级语言调用。

注意C++写的函数,C语言是不能调用的,但是C++是可以调用的C语言写的函数,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,424评论 3 44
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,613评论 3 71
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,776评论 0 27
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,895评论 2 13
  • 太困了,困的我都睡不着了。 分手有一周了,我以为我可以狠心的离开,我以为我说的分手我就会很潇洒的忘记你,原来,我还...
    青冢人家阅读 256评论 0 0