黑马程序员---第一篇 C语言总结(一)

------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运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化。

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

举例说明:

输出结果:20,10

                 10,11,12

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

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做了优化是可以的。

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


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

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

2、一维数组的存储

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

(2)数组名代表数组的首地址,从首地址位置,依次存入数组的第1个、第2个....、第n个元素。

(3)每个元素占用相同的字节数(取决于数组类型)。

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

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

 例子

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

 例子:

4、一维数组的遍历

 例子:

输出结果:12

                     30

                     10

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

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

(2)选取5个

(3)排重

(4)产生5注 

代码:


运行结果:2   3  18  15  19

                    12  6  17   9    20

                     1   21  9  13    15

                     10  12  2  15   17

                     2   13   10  4     7

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

四、指针与结构体

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值