【‘’‘’‘’‘【

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

C语言学习过程中的重点与难点:

(1)运算符:自增、自减运算符。

(2)进制:各种进制转换、原码、反码、补码。

(3)数组:一维数组、二维数组、多维数组。

(4)循环:多重循环的嵌套、排序、查找。?

(5)函数:递归函数、递归调用。

(6)指针:一级指针、多级指针、指针和数组、函数、结构体之间的关系。

(7)内存管理:C语言的内存管理问题、内存泄露、野指针。

(8)有参宏及条件编译。

(9)多文件开发:多文件编译、多文件开发。

以下的内容主要是我在学习C语言的过程中的一些心得体会与总结。

一、运算符(自增、自减)

(1)前缀表达式:++x, --x; 其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。

(2)后缀表达式:x++, x--; 先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化。

计算技巧:在变量的上方写两个数字,用逗号隔开,表示它的表达式的值和变量的值,使用的时候,使用前面的表达式的值。

例子:

输出结果:

二、进制:各种进制转换以及原码、反码、补码

1、进制的转换

2进制:逢二进1 0 1

8进制:逢八进1    01 234567

10进制:逢十进1 (默认的进制)   0 – 9

16进制:逢十六进1     0 - 9、 A B C D E F (内存的地址格式)

2、源码、反码、补码

(1)源码:

正数:就是其二进制表示           +1 00000001

负数:二进制的最高位是1          -1 10000001

(2)反码:

正数:就是其二进制表示           +1 00000001

负数:符号位不变,其他位逐位取反   -1 11111110

(3)补码:?

正数:就是其二进制表示            +1  00000001

负数:反码                        +1  11111111

注意:补码的真值不等于原码的真值的

三、一维数组

1、一维数组的定义:

数组的使用的流程:先定义 ---> 初始化 --->使用

数组定义完成后,如果不初始化里面存放的是系统随机的数字。

格式:int arr[10]  即定义长度为10的整型数组,每个都是Int型的,数组的名称 arr

(1)定义变量的同时,可以定义数组 int a[10],b,c;

(2) int n=5; int a2[n]; //其他编译器数组定义的时候,数组长度不能使用变量,但是 xcode做了优化是可以的。

(4)#define N 5 int a3[N+3];?

(5)int a4; int a4[10]; 数组的名称不能和变量名重名。

(6)数组名的命名原则严格遵守标识符命名原则。

(1)一维数组的存储

存储方式:?1)计算机会给数组分配一块连续的存储空间

2)数组名代表数组的首地址,从首地址位置,依次存入数组的第1个、第2个....、第n个元素 3)每个元素占用相同的字节数(取决于数组类型)

4)并且数组中元素之间的地址是连续。

模拟该数组的内存存储细节如下: int x[2]={1,2};?int ca[5]={‘a‘,‘A‘,‘B‘,‘C‘,‘D‘};

例子:

(2)一维数组遇到的疑问:数组如果没有初始化,数组中到底有没有值(以整型数组为例)

例子:

(3)一维数组的遍历

例子:

输出结果:

(4)实例:彩票(实现选5注,21选5):

思路:1.随机产生1-21之间的数字

2.选取5个

3.排重

4.产生5注

输出结果:

结论:如果定义数组后,没有初始化,数组中是有值的,是随机的垃圾数,所以如果想要正确使用数组应该要进行初始化。

四、指针与结构体

1、指针

注:严格的说指针是一个地址,是一个常量。

(1)定义一个指针变量

对指针变量的定义包括三个内容:

1)指针类型说明,即定义变量为一个指针变量;

2)指针变量名;?

3)变量值(指针)

其一般形式为: 类型说明符 *变量名;

其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指 向的变量的数据类型。

(2) 用函数实现两变量值交换

int a = 3,b = 5;

int temp; temp = a; a = b;?b = temp;

常规的做法不能实现变量值的交换,指针的地址交换也不能实现。

但是指针指向的值交换可以实现,如下所示:

(3)利用函数指针调用函数

例子:

2、结构体

(1)定义一个结构的一般形式为:

struct 结构名{

成员表列 };

(2)例如定义一个学生的结构如下:

struct stu

{ int num;

char name[20];  //char *name; char sex;?float score;

};

即成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类 型说明,其形式为:类型说明符 成员名;

注意:成员名的命名应符合标识符的书写规定。

(3)实例:先定义结构体变量,在初始化

从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:

1)先定义函数指针变量,如 int (*fun)(int *p,int len); 定义 fun为函数指针变量。

2)把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中 fun=getMax;

3)用函数指针变量形式调用函数,如程序 int max=fun(a,5);

使用函数指针变量还应注意以下两点:

1)函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可 使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。

2)函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它 只是一种表示符号。

五、内存管理、野指针、内存泄露

1、内存

(1)堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或 缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张); 当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 。

(2)栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}” 中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变 量)。除此以外, 在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值 也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

(3)内存分区

(4)内存分布图:(自上而下地址从低到高) 。

(5)

(6)

(7)堆的地址分配方式是从高到低

2、野指针

内存好比作尺子,尺子上的0 毫米处就是内存的0 地址处,也就是NULL 地址处。这条栓“野指 针”的链子就是这个“NULL”。

定义指针变量的同时最好初始化为NULL,用完指针之后也将指针变量的值设置为NULL。也就是说 除了在使用时,别的时间都把指针“栓”到0 地址处。这样它就老实了。

int *p;?p =(int *) malloc(100); //释放指针的操作 *(p+1) = 100;

3、内存泄露

int main(int argc, const char * argv[])

{ //该句话会造成内存泄露

int *p = malloc(4*sizeof(int));?return 0;

}

解决办法: 在p被释放之前,先要释放堆区中的内存空间。

free函数使用定义函数:void free(void *ptr);

六、 宏定义

被定义为“宏”的标识符 称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。

(1) 无参宏的宏名后不带参数。其定义的一般形式为:

#define 标识符(宏名) 字符串

其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为 宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。

(2) C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为:

#define 宏名(形参表) 字符串

时间: 2024-10-09 23:36:26

【‘’‘’‘’‘【的相关文章

【【分享】深入浅出WPF全系列教程及源码 】

因为原书作者的一再要求,在此声明,本书中的部分内容引用了原书名为<深入浅出WPF>的部分内容,假设博文不能满足你现有的学习须要,能够购买正版图书! 本人10月份提出离职,可是交接非常慢,预计年底才会交接完,趁着交接之际,自学了一下WPF,由于这是微软未来的发展趋势,自WIN7以来包含前不久公布的WIN8,核心还是WPF,在此,将自己的学习成果做一个总结,同一时候将自己学习积累的东西和广大博友分享,希望大家能共同进步.在文章的结尾我会将全系列的源码地址提供给大家,有须要的朋友能够下载下来自己研究

题解 P3389 【【模板】高斯消元法】

题解 P3389 [[模板]高斯消元法] 看到大家都没有重载运算符,那我就重载一下运算符给大家娱乐一下 我使用的是高斯-约旦消元法,这种方法是精度最高的(相对地) 一句话解释高斯约旦消元法: 通过加减消元法,依次制定x0,并通过加减消元法消去其他方程的x0的系数.对于这样的系数矩阵我们只进行初等变幻保证了其正确性 看代码吧,主要是希望帮助大家可以学到一些重载的方法 #include<iostream> #include<cstdio> #include<algorithm&g

opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar &amp; 图像对比度、亮度值调整

http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调整 标签: opencvvs2010c++图像处理 2014-03-18 21:43 43189人阅读 评论(99) 收藏 举报  分类: [OpenCV](18)  目录(?)[+] 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qian

linux—【绝对路径与相对路径】与【【文件基本操作】】(4)

[绝对路径与相对路径] 绝对路径:我们在获得一个文件的时候,从根目录到二级到更多级目录都写全了, 终才找到这个文件,这种方式就是“绝对路径” 相对路径:目标文件与我本身文件的相对位置 当前目录:./    . 上级目录:../   .. 上两级目录 : ../../ /home/shuhua/beijing/haidian/shangdi 我想要去“haidian”目录 cd haidian cd  ../    通过“相对路径”达到haidian cd  /home/shuhua/beijin

【【C++ Primer 第15章】 虚析构函数

学习资料 • C++中基类的析构函数为什么要用virtual虚析构函数 虚析构函数 1. 正文 直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏.具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放.假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数.那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏.所以,为了防止这种情况的发生,C++中基类的析构函

【【henuacm2016级暑期训练】动态规划专题 J】Red-Green Towers

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然最多1000行的样子. 从上到小做dp 设f[i][j]为前i行,使用了j个红色方块的方案数. f[1][r] = 1;如果r>0且g>0则f[1][r-1]=1; 然后如果第i+1行不用红色的话.->就只能用绿色了.. 算算绿色够不够填i+1个.. 够得话 f[i+1][j] = f[i+1][j] + f[i][j]; 然后看看红色够不够填i+1个 够得话 还可以用红色填i+1行 也即 f[i+1][j-(i+1

【【【【日常问题记录】】】】

1.虚拟机复制后,更改的相关配置 答:1.重新分配mac地址,点击网络适配器--高级--重新分配mac.   2.linux里的设置: 2.1 更改/etc/udev/rule.d/70-perxxxx-net.rules文件,只保留最后的一个,把eth1改成eth0,记住mac 2.2 更改/etc/sysconfig/network-script/ifcfg-eth0,把HWADDR改成刚才的mac 2.3 重启 2.php增加mysql扩展的时候,提示找不到mysql  handle 答:

【【【【【您的支持是我最大的动力】】】】】

您的支持是我写作专业文章的最大动力,文章不好还请见谅! 如果您愿意支持,请支付宝扫描以下二维码,略表心意,十分感激!

洛谷 P3376 【【模板】网络最大流】

题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui.vi.wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi) 输出 一行,包含一个正整数,即为该网络的最大流. 样例输入 4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 样例输出 50 数据规模: 对于30%的数据:N<=10,M<=2