首页 > 代码库 > 黑马程序员--c语言的简单总结

黑马程序员--c语言的简单总结

<style type="text/css" isprelink="true">@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);</style><style type="text/css">@import url(/css/cuteeditor.css);</style>

 

 

1. C程序的基本结构

声明部分:用来声明自定义函数的原型,需以“;”结尾

void test();

定义部分:

void test()

{  

printf(“我要去黑马学习ios!”);

}

声明放在.h文件中   ,定义放在.c文件中


C程序由常量、变量、运算符等基本要素和各种语句来构成。

2. 常量:常量包括一些确定的数值和一些值不能被改变的符号,如数值3.5,字符‘A’,字符串“abc”,符号常量N(假设之前有#define  N  10);具体分为以下几种:

? 数字常量

i. 普通数字:1,35,2.7

ii. 指数形式:2.45e-2等价于2.45*10-2 注意e大小写皆可,e前面的数字不能省,就算是1也不能省,后面的数字一定要是整数

iii. 长整型,单精度浮点型:3235L,32.5F 分别表示3235是长整型数据,32.5是单精度浮点型,若不写上L,F则表示3235是整型,32.5是双精度浮点型,L,F大小写皆可

? 字符常量

i. 普通字符常量:用单引号把一个字符括起来,如’A’,’@’

ii. 转义字符常量:一对单引号括起来并以“\”开头的字符序列,如’\n’(回车)、’\123’(8进制123对应的字符), ’\x23’(16进制23对应的字符)

iii. 每个字符都对应有一个ASCII码值,即一个整数值,例如’A’对应数值为65,’a’对应数值为97,相应位置的大小写数值相关32.

? 字符串常量

用一对双引号把一个字符序列括起来,如“ABCef”, 系统存放字符串常量,每个字符分配一个字节,各字符所占字节紧邻,并且字符串末尾会给再开一个字节里面放一个’\0’做为结束标志。’\0’对应的ASCII码值为0.

? 符号常量

定义格式 #define 符号常量名 符号常量值,如#define N 20则定义了符号常量N,其值为20,注意符号常量名和符号常量值之间是用空格隔开,而不是写上=号,#define和符号常量名之间也有空格的

扩充:oc中还有BOOL 用于表示真假   YES/NO 

3. 标识符

? 变量名,函数名,符号常量名全都是标识符,因此必须了解标识符的命名规则,以便判断一个变量名是否符合语法规则。

? 命名规则

以数字,字母,下划线这三类字符组成,但只能以字母或下划线开头,而不能也数字开头,另外不能将关键字做为标识符

4. 变量:用于存放数据。每个变量都对应内存空间的一个盒子,盒子里面存放的东西你可以看,也就是使用盒子的数据,也可以通过赋值表达式改变盒子里面存放的东西。

? 变量的定义: 定义变量,相当于向系统租用一个盒子。如大家去图书馆寄包,用校卡刷一下后就有个小格子供你使用,没刷之前那些小格子也存在,只是你没法使用它,租用了小格子后,你就可以放包包啊、金块啊、便便啊之类的进去。所以大家要清楚,每个变量都对应内存的一段空间,这段空间的大小用字节来衡量,每种类型的变量所占字节是不同的。所占字节越多,能表示的数据范围越大

i. 变量的定义格式:

类型名 变量名;

如 int  a;定义了一个整型常量a。变量名是由人类随便定义的,符合命名规则的前提下,爱写啥就写啥。所以什么flag,cc,y1或者函数名fun,find等全部是自定的用来做为名字而已,没有更特别的意义。

可同时定义多个变量,变量与变量之间用逗号隔开:

类型名 变量名1,变量名2,变量名3;

ii. 类型名

int 整型(2字节),long 长整型(4字节): 用于存放整数,只是数值范围不同

float 单精度浮点型(4字节) double 双精度浮点型(8字节):用于存放实数,数值范围,精度不同

char字符型(1字节):用于存放字符

? 变量赋值,初始化

int  a=3; 定义的同时初始化

a=6*9;   定义后在程序中进行赋值

由一个等号“=”和等号左右两边的运算对象构成的表达式叫赋值表达式

赋值表达式的功能:将等号右边的运算对象的值赋给等号左边的变量。因此等号左边必然是一个变量,不能为其他运算对象。

? 变量的值

只有在赋值操作时才会被改变,即将其放在等号左边时才会改变它的值,或自增自减操作:a=5,a++,a--,像a+3并未改变a的值,只是使用了a的值而已.

? 自增自减运算

变量++,++变量,变量变量  使变量的值自增1或自减1

等价于 变量=变量+1  变量=变量-1

++,--放于变量前后效果的区别:

当自增自减运算做为表达式的一部分时,++,--放在变量前面是先自增自减再使用变量的值,放在变量后面则是先使用变量的值,再自增自减

如printf(“%d”,++x);则相当于执行了++x; printf(“%d”,x);这样的操作所以打印出4

再如printf(“%d”,x++);则相当于执行了printf(“%d”,x); x++;这样的操作,则打印出3,当然最后x的值还是4。

5. 表达式:C语言通过各种表达式对数据进行最基础的处理。运算符加上运算对象即构成表达式。每个表达式运算后都会有最终的值,其值如何得出,不同表达式不同,详见下面的说明。

? 运算符和运算对象

一个运算符都有若干个运算对象,如 + 必然要跟两个运算对象才能进行加法运算:3+5。C语言里称需要跟n个运算对象的运算符为n元运算符。

一元运算符有:!,(类型名)

二元运算符有:+,-,*,/,%(求余), =,+=,-=,*=,/=,%=,< , > , <=, >=, = =(等于), !=(不等于),&&(且) , ||(或), . , ->

多元运算符有: ,

? 运算符的优先级和结合性

i. 优先级:同一个运算对象左右两边若同时有两个运算符,则这两个运算符优先级高的先进行运算。如3+5*6  因为5左右两边的运算符*比+优先级高,故先算5*6

ii. 结合性:若同一个运算对象左右两边的两个运算符优先级相同,则根据结合性判断先进行哪个运算,自左自右结合性的先算左边的运算符,自右自左的先算右边的运算符。如3*5/6,因为5左右两边的运算符*与/优先级相等,故此时要根据结合性进行判断,结合性上*和/都是从左往右,故先算3*5

iii. 各运算符的优先级和结合性见P378附录D

? 强制类型转换

格式: (类型名) 表达式 。将后跟的表达式的值的数据类型转换为与圆括号内的类型名一致的类型。注意类型名一定要用() 括起来。如(int)6.5则运算后值为6

? 算术表达式

i. 算术运算符:+,-,*,/,%(求余)

ii. 由算术运算符加上运算对象构成算术表达式,如3+3*6-9/2

iii. 值:跟我们小学时学的一样,就是表达式的计算结果

iiii. 整数除以整数结果取整数部分,故1/3得到的值是0

v. 5%3 结果为2,想想小学除法,求余得到的是余数不是商。

? 赋值表达式

i. 赋值运算符:=,+=,-=,*=,/=,%=

ii. 赋值表达式:变量=表达式,如x=3+6,x+=6-9,x+=x*=3+4 注意等号左边只能是变量

iii. 复合赋值运算符的运算:以/=为例:x/=表达式 等价于 x=x/(表达式)如x/=3*5等价于x=x/(3*5)而不是x=x/3*5

iiii. 值:=号左边的变量最终的值

? 逗号表达式:

i. 逗号运算符: ,

ii. 用逗号将各种表达式连续起来构成逗号表达式,如3+4,a=9,8*a

iii. 值:逗号表达式会从左往右依次计算其包含的各个表达式,但以最后一个的表达式的值做为整个逗号表达式的值,如上例表达式的值为8*a的值

? 关系表达式

i. 关系运算符:< , > , <=, >=, = =(等于), !=(不等于)

ii. 由关系运算符加上运算对象构成关系表达式,如3>=4, 2==a

iii. 值:满足相应运算符所指定的关系的值为1,否则为0

? 逻辑表达式:

i. 逻辑运算符:&&(且) , ||(或) , !(非)

ii. 由逻辑运算符加上运算对象构成逻辑表达式,如3&&4, x||!y

iii. 值:满足相应运算符所指定的关系的值为1,否则为0

iiii. 进行 ||(或) 运算时,若||左边的表达式值为1,则不再对右边的表达式进行运算。

v. 进行 &&(且) 运算时,若&&左边的表达式值为0,则不再对右边的表达式进行运算。

二、C语句:第1点所展示的C语言的基本结构里,定义完变量后就是执行语句部分,在这部分中一般结构可分为:

数据输入部分 ->输入函数如scanf等来实现

数据处理部分 ->表达式语句、选择结构语句、循环结构语句实现

数据输出部分 ->输出函数如printf等来实现

6. 输入输出函数

? scanf(“格式控制串”,变量地址表列);

如scanf(“%d%c%d”,&a,&ch,&b);  

注意:

i. 格式符与后面的地址表列一一对应,如第一个%d对应&a,然后%c对应&ch

ii. 第二个参数给的是地址,即要么是 &+变量名 或 数组元素名 的形式,要么就是一个数组名或指针变量名,如int *p,a; p=&a; scanf(“%d”,p);

iii. 考试时注意看题目给你写好的scanf的格式,切记按相应的格式进行输入。

1. 若其格式控制串内各格式符用“,”隔开如scanf(“%d,%c,%d”,&a,&ch,&b);那输入时也要用逗号隔开,如此例输入时应:3,+,5

2. 若是这种格式scanf(“%d %d”,&a,&b);则输入时应用空格或回车隔开:   3 5;

3. 若是这种格式scanf(“%d%c%d”,&a,&ch,&b);则输入时应3+5,若写成3 + 5则a=3,ch=‘ ’(空格),b=任意值      (自己上机运行看看结果)

? printf(“格式控制串”,输出项表列);

如float x=7.5; printf(“%8.2f”,x);此处的意思是将x打印出来,且占8列,保留两位小数。自己上机运行看看效果。

? 常用格式符汇总:要输出或输入某类型的数据,就要用相应的格式符

i. %d/%i:输入输出整型数据,%ld:输入输出长整型数据

ii. %c:输入输出字符型数据

iii. %f:输出单(双)精度浮点型数据,输入单精度型数据。            %lf:输入双精度型数据

iiii. %s:输入输出一个字符串,用printf输出字符串时,输出项书写时可为字符串常量,或字符数组名或字符变量的地址,其实质是从该地址对应的变量开始将该变量及其后所有字符变量的值输出到屏幕上,直到遇到’\0’为止。

iiiii. %p:输出地址

如printf(“%s”,”hello”);或char str[10]=”hello”; printf(“%s”,str);

v. %u:输入输出无符号整型,%o:输入输出八进制数,            

%x:输入输出十六进制数

? getchar();

函数调用后返回用户输入的一个字符,故需再定义一个变量来存放这个字符,即使用时应 char c; c=getchar();意思就是接收用户输入的一个字符,并将其赋值给变量c。

? putchar(字符常量或字符变量名);

如char c=’A’; putchar(c);或putchar(‘A’);都会向屏幕输出字符A。

? puts(字符数组名或字符指针);输出该字符数组或该指针所指向的变量开始的一个字符串。

? gets(字符数组名或字符指针);输入一个字符串,将字符串存放在该数组中或将字符串的首地址赋给字符指针。

7. C语言的语句

? 表达式语句:由表达式末尾加上分号构成。

? 函数调用语句:由函数调用表达式加上分号构成。

? 空语句: ;   (啥事也不做,但也构成一个语句)

? 选择结构语句:if语句 switch语句

? 循环语句:for语句 while语句 do while语句

? 复合语句:用花括号{}将以上任意语句括起来构成一条复合语句。

8. 选择结构语句

? if(表达式) 语句1 else 语句2

如果if语句的圆括号内的表达式值为非0,则执行语句1,值为0则执行语句2。

i. 表达式可为任意表达式,if语句执行的实质是判断表达式的值是否为0来决定执行语句1还是语句2。另外请在此处表达严重关切,不管是高手还是菜鸟经常会把判断两个数相等的符号“==”写成了一个等号“=”成为了赋值运算,这样的写法不会引发编译错误,但结果会与原意大大不同,所以考试前请再三提醒自己。

ii. 语句1和语句2都只能是一个语句,若要跟多条语句,切记用一对{}括起来,构成复合语句;也不要随便在圆括号后加“;” ,因“ ;”构成一条空语句,这会使后面跟的语句1不再属于if语句的组成部分

iii. if语句的三种结构

1. 单边: if(表达式) 语句

2. 双边:if(表达式) 语句1 else 语句2

3. 多层(重点掌握):

if(表达式1) 语句1

else if(表达式2) 语句2

else if(表达式3) 语句3

else 语句n

? 条件运算符 表达式1? 表达式2 : 表达式3

若表达式1的值非0,则取表达式2的值做为整个表达式的值,否则取表达式3的值为整个表达式的值。如 3>4? 1:2  该表达式的值为2

? switch语句:

switch(表达式0)

{

case 表达式1:语句1

case 表达式2:语句2

case 表达式n:语句3

default: 语句n+1

}

语句执行过程:先计算表达式0的值,然后判断该值与表达式1到表达式n中的哪个相等,若与表达式i的值相等,则执行表达式i后的所有语句,当遇到break;语句时结束整个switch语句的执行,也就是说若找到一个入口开始执行后,没遇到break;它就会依次执行入口开始往下的所有语句。表达式1到表达式n的值都不相等的情况下执行default后跟的语句。每个case后可跟多条语句。

9. 循环结构语句

? for循环语句

for(表达式1;表达式2;表达式3) 循环体语句

语句执行过程:

1. 计算表达式1

2. 判断表达式2的值是否为0,若为0,语句执行结束,若不为0,进入步骤3

3. 执行循环体语句(需注意的是循环体语句只能有一个语句,若要包含多个语句要用一对{}括起来,构成一条复合语句,此处也不要随便加上 “ ; ”,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于for循环语句的部分)。进入步骤4

4. 计算表达式3,然后重新进入步骤2

? while循环语句 do while循环语句

i. while(表达式) 循环体语句

执行过程:

1. 判断表达式的值是否为非0,若是进入步骤2,否则结束语句执行。

2. 执行循环体语句,重新回到步骤1。

i. do  循环体语句  while(表达式);

执行过程:

1. 执行循环体语句,进入步骤2

2. 判断表达式的值是否为非0,若是重新回到步骤1,否则结束语句执行。

 

这里要注意的地方跟for语句一样,即循环体语句只能有一个语句,若要包含多个语句要用一对{}括起来,构成一条复合语句,此处也不要随便加上 “ ; ”,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于while循环语句的部分,另外do while循环的while(表达式)后是要加“;”的。

? break语句:放在循环体内实现的功能是结束其所在的那层循环的执行

三、较复杂的数据结构

10. 数组:相同类型的变量的集合,这些变量所对应的空间位置两两相邻。

? 定义格式:数据类型   数组名[整型常量];如 int a[10]; 定义了一个整型数组,数组名为a,这个数组含有10个元素。

? 引用数组元素: 格式:数组名[下标]   切记下标值从0开始。下标可为常量,表达式,变量等,如int i=3; a[0]=5;a[3*2]=9; a[i]=7;

? 初始化:数据类型   数组名[整型常量]={数据表列};将数据表列的各个值依次赋值给数组的各个元素。如int a[5]={0,1,2,3,4};则数组a各元素a[0]到a[4]的值分别为0,1,2,3,4

? 遍历数组元素

数组定义后,我们不能对数组进行整体的操作,如int a[10];不能用a=3这样的操作将数组的各元素都赋值为3;而只能一个一个元素的进行赋值,如a[0]=3;a[1]=3;a[2]=3…a[9]=3; 当然此时我们就可以借助于一个for循环来控制下标的变化从而对数组的各个元素进行赋值

for(i=0;i<10;i++) a[i]=3;

当然这只是用for循环遍历数组各元素的最简单的例子,一般考试考的是找出数组元素的某种特性的极值,比如最大值,最小值,或对数组各元素进行排序,这时我们就可以使用for循环来遍历数组的各元素,然后在当前循环中得到一个元素再对其进行处理。如i=2时访问到的元素是a[2],你就可以问问它,你是不是最小值啊。

? 整型数组

int a[10]; 整型数组里的各个元素存放的是整数。a[3]=3;

? 字符型数组

char  str[20];字符型数组里的各个元素存放的是字符。   str[3]=’A’;

11. 指针

? 指针变量的声明: 类型名 * 指针变量名;

? 通过指针变量访问它所指向的普通变量的值

先将普通变量的地址赋值给指针变量,再通过指针运算符* 得到普通变量的值。

int *p,x,y;

x=3;

p=&x;

则printf(“%d”,*p);会打印出3即x的值

y=*p;则y的值变为3

*p=5;则x的值变为5

? 通过指针变量访问一维数组的元素

先将一维数组首地址赋值给指针变量,一维数组的首地址用其数组名表表示,首地址也是数组下标为0的那个元素的地址,则此时该指针变量指向下标为0的那个元素。

? 指针变量加上(减去)一个位移的效果

若指针变量存入的是数组元素的地址,则其加一减一得到的是那个数组元素下一个或前一个元素的地址

int a[10]; p=&a[3];

*p得到的是a[3]的值。

若p++;此时p存放的是a[4]的地址&a[4]; *p得到的就是a[4]的值。

或p--;此时p存放的是a[2]的地址&a[2],*p得到的就是a[2]的值。

若指针变量存入的是数组首地址,则相当于存入&a[0],则其加一后得到的是a[1]的地址

如p=a;则*p为a[0]的值,*(p+1)为a[1]的值。

? 判断是否合法访问数组元素:若是指针法访问,判断指针后跟的是否地址;若是下标法访问,判断下标有无越界。

? 指针数组:指针数组的数组元素都是指针变量,是用来存放变量的地址的,定义格式为 类型名 * 变量名[数组长度]; 如int * p[10];

? 指向指针的指针:指针变量也是一种变量,故在内存中也有对应的一个地址,而要存放指针变量的地址,就要求助于用来存放指针变量的地址的指针变量,定义格式  类型名 ** 变量名;如 int *p1; int **p2; int a=3;可进行赋值p1=&a; p2=&p1; 则a 、*p1和 **p2的值都是3.

12. 字符串函数

? gets(字符数组名或字符指针变量);

如char str[10],* str2; str2=str;则gets(str);或gets(str2);都是接收用户输入的字符串如“ABC”存入到字符数组str中

? puts(字符数组名或字符指针变量或字符串常量);

如char str[10]=”china”; char *str2;str=str2;  则puts(str); 或puts(str2); 或 puts(“china”);都会在屏幕上打印出 china

? strlen(字符数组名或字符指针变量);字符串测长函数

char str[20]=”hello world!”;  

int len;len=strlen(str);得出的结果是len的值为12

? strcat(字符串1的地址,字符串2的地址);

将字符串2的内容连接到字符串1的尾部。

char str1[20]=”ABC”,str2[20]=”xyz”;

strcat(str1,str2);

则程序运行的结果是str1内存放的字符串变为ABCxyz,当然str2存放的字符串还是xyz。

? strcmp(字符串1的地址,字符串2的地址);

比较串1和串2哪个比较大。比较大小的依据是,两个字符串从左往右相应位置上第一个不相等的字符ASCII码值之差。

char str1[20]=”ABCE”,str2[20]=”ABDE”;

int i;

i=strcmp (str1,str2);

第一个不相等的字符为str1的‘C’和str2的‘D’,而二者相差-1,故-1做为strcmp函数执行的结果返回到被调用的位置,该位置位于赋值表达式内,故将其值赋值给i,即此时i的值就是-1.

? strcpy(字符串1的地址,字符串2的地址);

将字符串2的内容复制到字符串1内。

char str1[20]=”ABC”,str2[20]=”xyz”;

strcpy(str1,str2);此时str1的内容为”xyz”,当然str2的内容没变

strcpy(str1,”uvw”);此时str1的内容又变成了“uvw“。

四、其他

13. 函数

? 理解函数运用原理:可将一个特定的函数比喻成生成特定产品的生产线,我们把一些经常要重复做的操作组织成一条生成线,这条生产线要生产产品首先得把材料给它,这些材料通过其定义的形式参数来获得。得到这些材料后,经过一系列的生产工序得到最终的产品,这些生产工序就相当于函数体里的各条执行语句。而想把这个生产出的产品交给布置产生任务的函数调用语句的话,必须使用到return 语句,而平时没给生产线布置任务时,它就停在那边不起任何作用。

? 函数定义

函数类型  函数名( 形式参数列表 )

{

       内部变量定义和声明部分

    执行语句

}

如:

int  max (int x , int y )

{  int  z ;

   z= x > y ? x : y ;

   return  ( z ) ;

}

注意点:

1.函数类型是指返回值的类型,即要与return语句后跟的表达式的值的类型一致。若函数类型为void则说明该函数无返回值,即函数体里不能出现return 语句

2.形式参数列表里定义的变量要记得给它们指定类型,而且如果同时要定义多个,应在每个前面都分别指定类型名,而不能写成int x,y;

3.函数体里能写的语句跟main函数一样,在开头可定义所需要的变量,后面跟上一堆执行语句。

? 函数调用流程

以上面的函数为例,在main函数进行调用:

void main()

{ int a,b,c;

 scanf(“%d%d”,&a,&b);

 printf(“%d”,max(a,b));或 c=max(a,b);printf(“%d”,c)以上两种方法都会在屏幕中打印出a,b间的较大值。

调用函数的格式 函数名(实际参数列表);调用的时候像什么函数类型,形式参数的类型就不要加上去了。max(a,b)中max就是函数名,写上变量名a,b是实际参数列表,执行这个调用语句时,会先把a,b的值给相应位置的形式参数即执行了x=a,y=b这样的操作,然后开始执行max函数的函数体的语句。当max函数体里执行到一个return语句时,则max函数结束执行,将return后的表达式的值返回给main函数调用max函数的那个位置,即若上面a=3,b=5则max(a,b)return后的表达式的值应该是5也就是说执行完max后把5返回到调用max的位置可看成printf(“%d”,5);或另一种解法的c=5。

}

14. 宏定义

? 无参宏定义 #define  标识符  值   定义后,出现所定义的标识符的地方都将以定义时指定的值来代替。

#define  M  2+3

main()

{  int x;

  x=M*M;  则x的值为2+3*2+3=11若想得到的结果是(2+3)*(2+3)则定义时也写成这样 #define M (2+3)

}

注意#define、标识符、值之间都要用空格隔开,且宏定义结尾不需加分号。

? 带参宏定义  #define 标识符(参数表)  值

#define  S(x,y)  x*y

main( )

{  int a=3,b=4,c=5,d=6;

   printf("a*b=%d\n", S(a,b));  此时会打印出 a*b=12

   printf("a+b*c+d=%d\n" , S(a+b,c+d)); 此时会打印出a+b*c+d=29,带参宏定义执行时是将a+b这样一个表达式代替x,c+d这样一个表达式代替y,所以S(a+b,c+d)进行的是a+b*c+d的运算,而不是将a+b的值给x,c+d的值给y然后再做x*y,这点跟函数调用传递参数是不一样的

}

#ifndef debug

….


#define debug 2

#endif


这个原理用于避免头文件的复制


? 自定义类型名typedef:对已存在的类型名取一个外号。

i. 基本格式:typedef  原类型名  新类型名;

ii. typedef  int INTEGER; 则int a,b;等价于INTEGER a,b;

iii. typedef  int  NUM[10]; 则 int a[10];等价于 NUM a; a即为一个有10个元素的数组的数组名。

iiii. typedef int * INTEGER; 则int *a,*b;等价于INTEGER a,b;

15. 结构体,共用体,枚举类型

? 结构体

i. 结构体类型的定义及变量的定义

struct  结构体名

{类型 成员1;

 类型 成员2;

 ……

 类型 成员n;

}变量名;

struct student

{  long  num;

char name[10];

int score[4];

}st1;定义类型时同时定义变量

struct student st2;定义类型后,用类型名定义变量

还有一种

struct

{  long num;

char name[10];

int score[4];

}st3;不给类型名,直接定义变量

ii. 结构体变量所占字节数:各成员所占字节数之和,如以上st1,st2,st3的字节数皆为4+10+2*4=22

iii. 结构体变量初始化:struct student a={20030001, "张三", {70,75,80,85}};

还有黑马老师教的

struct student a = {.name = “zhangsan”, .num = 1101080726, {28,89,98}};

iiii. 结构体数组定义及初始化:

struct student a[3]={{20030001,"zhang",89,90,91,92},

           {20030002,"liu",68,69,70,71},

           {20030003,"li",57,58,59,60} };

v. 结构体变量成员的访问

1. 结构体变量名. 成员名 如st1.num

2. 使用结构体类型的指针:

(*结构体指针名) . 成员   或    结构体指针名–>成员名

struct student *st;  st=&st1;  st->num 或(*st).num


结构体的用处很大,oc中的如NSRange,NSPoint,NSSize,NSRect都是结构体结构体。可以用来表示字符串的内部范围,图像的位置等等

? 共用体

i. 共用体类型的定义及变量的定义

union  共用体名

{ 类型  成员名1;

  …

  类型  成员名n;

};

变量的定义与结构体类似,也有三种方法。

union data

{

  int i;

char ch;

float f;

}d1; 定义类型时同时定义变量

union data d2; 定义类型后,用类型名定义变量

union

{

  int i;

char ch;

float f;

}d3; 不给类型名,直接定义变量

ii. 共用体变量所占字节数:各成员所占字节数的最大值,如上d1,d2,d3所占字节数皆为4.(单精度浮点型变量所占字节数最多为4).

iii. 共用体变量成员的访问

1. 共用体变量名. 成员名 如d1.i

2. 使用共用体类型的指针:

(*共用体指针名) . 成员   或    共用体指针名–>成员名

union data *dd;  dd=&d1;  dd->i 或(*dd).i

iiii. 共用体成员的值:由于共用体各成员共用同一段内存区,故同一时刻只有一个成员的值是正确的。如d1.i=5;d1.ch=’a’;则此时d1.i的值就不是5了,而是其他值了,d1.ch的值是’a’

? 枚举类型

i. 枚举类型的定义:                                                  enum 枚举名{枚举元素名1,枚举元素名2,…,枚举元素名n};枚举元素名是标识符要符合命名规则

ii. 枚举元素的值:

默认值分别为0、1、…、n-1枚举元素的值也可在定义时重指定,对于没有指定值的元素,按顺序加1

如enum weekday{sun=7,mon=1,tue,wend,thur,fri,sat};则sun值为7,mon值为1,tue值为2,wend值为3,thur值为4,fri值为5,sat值为6

oc的NSCoparisionResult 就是一个枚举

NSOrderAscending,NSOrderSame,NSOrderDescending


枚举元素是常量其值只能在定义时指定,定义后不能再赋值。


手打的,如有错误之处还望见谅

还有一些哪容这里就不做总结了。


本人作为一名准备去黑马培训的学员,只是在这里做一些简单的总结,当然,一些内容不是自己写的,在书籍和一些网上资料整理的。


越高级的语言逻辑性越强,c语言面向过程,oc面相对象,学习ios,处理问题尽量以对象的思想来思考解决。学习一门面相对象的语言吧,非常有意思。

<style type="text/css" isprelink="true">@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);</style><style type="text/css">@import url(/css/cuteeditor.css);</style>

黑马程序员--c语言的简单总结