C语法总结Word文档下载推荐.docx

上传人:b****8 文档编号:22485188 上传时间:2023-02-04 格式:DOCX 页数:26 大小:26.73KB
下载 相关 举报
C语法总结Word文档下载推荐.docx_第1页
第1页 / 共26页
C语法总结Word文档下载推荐.docx_第2页
第2页 / 共26页
C语法总结Word文档下载推荐.docx_第3页
第3页 / 共26页
C语法总结Word文档下载推荐.docx_第4页
第4页 / 共26页
C语法总结Word文档下载推荐.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

C语法总结Word文档下载推荐.docx

《C语法总结Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C语法总结Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。

C语法总结Word文档下载推荐.docx

c.共用体union

指针类型*

空类型void

2.输入输出函数

printf(格式控制字符串,输出列表)//格式控制字符串可由格式字符串(以%开头)和非格式字符串(原样输出)组成.

scanf(格式控制字符串,地址表列)

putchar()//字符数据的输出等同与printf(%c,.)位于<

stdio.h>

getchar()//从键盘输入中读取一个字符。

scanf(%c,&

mchar)

3.逻辑运算

!

(非),&

&

(与),||(或)

4.二维数组

定义:

类型说明符数组名[常量表达式1][常量表达式2]

a.存储器单元是一维线性排列的。

是按行存放的。

b.对于全部元素赋初值,则数组第一维的长度可以省略,但是第二维不能省。

inta[][3]={1,2,3,4,5,6}

c.可以只对部分元素赋初值,没赋初值的元素自动取0值。

d.一个二维数组可以分解为一个多个一维数组。

例:

a[3][4]可分解为三个一维数组,其数组名分别为a[0],a[1],a[2],而这个

一维数组都有4个元素。

如一维数组a[0]有元素为:

a[0][0],a[0][1],a[0][2],a[0][3]

5.字符数组

c中没有字符串数据类型,是用字符数组来表示字符串变量的。

字符串总是以'

\0'

作为串结束符,所以,字符串就是一种以‘\0’结束的字符数组。

在求字符串长度时,不包含结束符'

但是sizeof却要包含。

charc[]="

string"

;

charc1[]={'

s'

'

t'

r'

i'

n'

g'

};

printf("

%d\n"

sizeof(c));

//7,默认在string后加'

sizeof(c1));

//8,对于字符数组只能自己加结束符

strlen(c));

//6求字符串长度时,不包含结束符'

strlen(c1));

常用的字符串处理函数(在stdio.h中与string.h中):

puts(字符数组名)---把字符数组中的字符串输出到显示器。

gets(字符串数组名)--从输入设备得到字符串。

strcat(字符数组名1,字符数组名2)--把字符数组中2中的字符串连接到字符数组1中字符串的后面,并删除字符串1后的串标志"

strcpy(字符数组名1,字符数组名2)--把字符数组2中的字符串复制到字符数组1中,串结束标识'

也一同复制。

strcmp(字符数组名1,字符数组名2)--按照ASCII码顺序比较两个数组中的字符串,并由函数返回比较结果。

strlen(字符数组名)---返回字符实际长度(不含字符'

6.函数

对于被调用函数的声明和函数一般形式:

类型说明符被调函数名(类型,类型,..);

如果被调用函数的返回值是整型或字符型时,可以不对被调用函数作说明而直接调用。

如果被调用函数定义出现在主调用函数之前,在主函数可以不对被调用函数作说明而直接调用。

7.变量的作用域及存储特性

a.局部变量:

又称内部变量。

在函数内作定义说明,其作用域仅限于函数内。

允许在不同的函数中使用变量名,它们代表不同的对象,分配不同的单元,互不干扰。

b.全局变量:

又称外部变量,它是在函数外部定义的变量。

它不属于哪一个函数,而属于一个源程序文件。

其作用域是整个源程序。

在函数中使用全局变量,一般应作全局变量说明。

只有在函数中经过说明的全局变量才能使用,说明符为:

extern.但是在一个函数之前定义的全局变量,在该函数内可以再加以说明。

另注:

外部变量在定义时就已分配了内存单元,外部变量定义可作为始赋值,外部变量说明不能再初始值,只是表明在函数内要使用某外部变量。

在同一源文件内,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。

变量的存储特性:

a.auto(自动变量)默认。

为动态存储,既只有在使用它才分配存储单元,开始它的生命周期。

b.extern(外部变量) 

为静态存储,外部变量等同与全局变量。

当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量在其它的源文件中也有效。

c.static(静态变量)为静态存储方式,可分为静态局变量和静态全局变量。

静态局变量:

在局部变量的说明前再加上static说明。

在一个函数f(){staticinta,b;

staticfloata[5];

...}

特点:

(1).静态局部变量在函数内定义,当调用时已存在。

当函数f()退出时仍然存在,生存周期为整个源程序。

(2).静态局部变量虽然生存周期为整个源程序,但是退出其函数后存在但是不能使用。

(3).允许对构造类静态局部量赋初值。

若未赋值,则系统自动赋值为0值。

(4).对基本类型的静态局部变量若没赋值,则系统自动赋值为0.而对于自动变量不赋初值,则其值是不固定的。

静态全局变量:

全局变量再加以static就成了静态全局变量。

对于静态全局变量其则只在定义该变量的源文件有效,在同一源文件的其他源文件中是不能使用的。

(5).把局部变量改变为静态变量后就是改变它的存储方式,即生存周期。

把全局变量改变为静态变量后改变它的作用域,限制了它的使用范围。

d.寄存器变量(register).当一个变量反复访问时,就可将此变量声明为register。

放在cpu的寄存器中。

别注:

只有局部自变量和形式参数才能定义为寄存器变量。

使用个数很有限。

对于Truboc、MSC等使用是按自动变量处理的。

8.内部函数和外部函数

内部函数--一个只能被本文件中的其他函数所调用的函数。

形式:

static类型函数名(形参表)

外部函数---如果在函数标识符前面加上extern,形式:

externintfun(inta,intb)其中,extern为默认。

9.指针变量声明

[存储类型]类型标识符*指针变量名;

[存储类型]类型标识符*指针变量名=变量地址;

(注:

int*p;

表示:

变量p表示指针变量;

另外P可用来存放整数变量的地址。

指针变量本身存储的都是地址,每个指针(地址)占4个字节(在VC中),例:

char*p,size(p)为==4);

10.指针运算

a.指针赋值:

如:

intx;

int*p=&

x;

也可在程序中对其初始化:

intx,*p;

..p=&

x

注意:

在没赋初值时,指针变量的内容是不确定的。

如果此时引用指针指向的变量,将会产生不可预料的后果。

*p=100;

//错误,p没有初始化。

b.指针的加减:

指针变量加1不能是简单的地址加1,加上一sizof(指针变量所指类型)。

两个指针变量在指向同一存储区域(数组)的元素时,可以进行相减。

其差绝对值表示两指针元素之间相差的元素个数。

11.指针与一维数组

注:

c语言中规定,数组名代表第一个元素的地址,是指针常量。

数组a的首地址可用&

a[0]表示,或a表示。

对于如:

inta[10],*p;

p=a;

或p=&

a[0];

或定义为:

inta[10];

int*p=a;

小结:

指针与一维数组的关系

a[i],&

p[i],a+i,p+i 

表示数组元素a[i]的地址

a[i],*(a+i),*(p+i),p[i] 

表示元素a[i]的内容。

p++,p-- 

表示使p后移或前移一个元素的存储空间

*p++,*p-- 

表示先取p所指对象*p,然后使p后移或前移一个元素的存储空间。

(*p)++,(*p)-- 

使p所指对象的值加1或减1.相当于:

*p=*p+1;

*++p;

*--p;

取指针变量p加1或减1后的内容。

相当于:

*(++p),*(--p);

++*p,--*p;

使p所指向的变量的内容加1或减1

12.动态申请存储空间

内存申请库函数:

void*malloc(size);

例:

int*p=(int*)malloc(10*sizeof(int));

内存释放库函数:

voidfree(p);

free(p);

13.预处理

指在进行编译的第一遍扫描(词法扫描、语法分析、代码生成、代码优化)之前所做的工作。

C中是由预处理程序负责完成。

当对一源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕后自动对源程序进行编译,将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。

(在C中如宏定义、文件包含、条件编译等为预处理)。

宏定义:

不带参数的宏定义#define标识符字符串 

#definePI3.1415926

带参数的宏定义 

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

带参数的宏调用:

宏名(实参表) 

#defineM(y)(y*y+3) 

调用:

k=M(5)*10;

a.带参数的宏定义中,宏名和形参之间不能有空格出现。

b.在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。

c.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。

d.带参的宏和带参函数很相似,但有本质上的不同。

在带参宏定义中,形式参数不分配内存单元,因此不用定义类型。

而宏调用中的实参有具体的值,要用它们去代换形参,因此进行类型说明。

在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时把实参值赋予形参,进行值传递。

#include"

stdio.h"

#defineSQ(y)((y)*(y))

main()

{

inti=1;

while(i<

=5)

//printf("

SQ(i++));

//输出为:

1,9,25

SQ(++i));

//输出为:

9,25,49 

对SQ(++i)首先用((++i)*((++i))来替换

}

14.文件包含

一个源程序通过#include命令把另外一个源文件的全部内容嵌入到源程序中来。

在编译时并不是作为两个文件连接,而是作为一个源程序编译,得到一个目标文件。

格式:

文件名"

file.h"

首先在使用包含文件的源文件所的目录查找file.h文件,若没有找到指定的文件,再到系统指定的标准目录查找。

#include<

file.h>

仅在编译系统指定的标准目录查找文件file.h.

15.条件编译

希望部分行在满足一定条件才进行编译,即按不同的条件去编译不同的程序部分,因而产生不同的目标代码条件。

使用条件编译功能,为程序的调试和移植提供了有力的机制,使程序可以适应不同系统和硬件设置的通用性和灵活性。

#ifdef标识符

程序段1

#else

程序段2

#endif

#defineR1

doublec,r,s;

请输入圆的半径或矩形的边长:

\n"

);

scanf("

%d"

&

c);

#ifdefR

r=3.14*c*c;

圆的面积=%f\n"

r);

s=c*c;

矩形面积=%f\n"

s);

#endif 

..

16.指针型函数

指函数返回指针值的函数。

类型说明符*函数名([参数列表]){} 

多用于构造类型数据结构(创建一个链表、返回指向头结点的指针)。

int*max(int*a,int*b)

return(*a>

*b)?

a:

b;

voidmain()

inta,b,*p;

%d,%d"

a,&

b);

p=max(&

max=%d"

*p);

17.指向函数的指针

C语言规定,函数名就表示该函数所点内存区域的首地址,将函数首地址赋给某一指针变量,则通过该指针变量就可以调用这个函数。

这种指向函数的指针变量就称为函数指针变量。

类型标识符(*指针变量名)([参数列表]);

类型标识符:

表示指针所指函数的返回值的类型。

(*指针变量名)表示"

*"

后面定义的变量为指针变量,括号表示指针变量所指的是一个函数,而参数列表则列出函数的类型。

用函数指针变量调用函数格式:

(*指针变量名)(实参表)或指针变量名(实参表)

#include<

math.h>

floatarea(inta,intb)

return(float)a*b/2;

floatlength(inta,intb)

return(float)sqrt(a*a+b*b);

intm,n;

floats,l;

float(*f)(int,int);

//定义一个指向函数的指针变量

m,&

n);

f=area;

s=(*f)(m,n);

f=length;

l=(*f)(m,n);

area=%.2f,length=%.2f\n"

s,l);

要注意区分定义语句int(*p)()和int*p()。

这类组合说明符遵循“从里到外,先右后左”的规则。

对于int(*p)()的阅读顺序是:

从标识符*p开始,说明*p是一个指针变量,它指向一个函数(先读右边),它返回int类型(再读左边)。

对于int*p(),从标识符p开始,p是一个函数(先读右边),返回值为类型为int*(再读左边),即它是一个指针型函数。

18.二维数组和指针

二维数组中的行、圾元素的地址

a、&

a[0] 

二维数组首行(第0行)的首地址。

a[0]、*(a+0)、*a 

0行0列元素地址

a+1 

1行首地址

a[1],*(a+1) 

1行0列元素地址。

a[i]+j、*(a+i)+j、&

a[i][j]第i行第j列的首地址

*(a[i]+j)、*(*(a+i)+j)、a[i][j]第i行第j列元素值

19.指向二维数组中一行元素的指针

数据类型(*指针名)[N]

inta[3][4],int(*p)[4];

这里p是一个指针变量,它指向包含4个整型元素的一维数组。

可以进行p=a初始化。

但是不能p=&

a[0][0],因为数组名a是指针常量,它的基类型是包含4个整型元素的一维数组,与行指针变量p的基类是一样的。

但是a[0][0]是数组中的一个元素,它的基类是整型。

所以不能将引地址赋给p.

例如:

inta[3][4]={{1,3,4,9},{7,12,24,17},{11,31,25,30} 

转载:

inti;

int(*p)[4]=a;

for(p=a;

p<

a+3;

p++){

for(i=0;

i<

4;

i++)

%3d"

*(*p+i));

20.指针数组

可以使若干个行指针分别指向二维数组中的每一行,把这些指指针存放在一个数组中,称为指针数组。

指针数组的定义形式为:

类型说明符*数组名[常量]例:

char*p[10];

按照右结合的原则,p先与[10]结合,说明了是数组的形式,它有10个元素,p[10]再与前面的*结合,表示数组p[10]是一个指针变量,即每一个数组元素都是一个指针变量,现由左面的类型char,可知指针数组中的每一个指针变量都指向一个字符串。

例如:

将"

china"

"

india"

japan"

america"

canada"

按字母顺序(由小到大)输出。

string.h>

voidsort(char*a[],intn)

char*temp;

inti,j,p;

n;

p=i;

for(j=i+1;

j<

j++)

if(strcmp(a[p],a[j])>

0)p=j;

if(p!

=i)

temp=a[i];

a[i]=a[p];

a[p]=temp;

char*name[]={"

inti,n=5;

sort(name,n);

n-1;

%s\n"

name[i]);

21.二级指针

是指向一级指针的指针。

即二级指针中存放的是一级指针的地址。

[存储形式]数据类型**指针名;

inta,*p,**q;

p=&

a;

q=&

p;

american"

char**p;

5;

p=name+i;

22.指针数组作main函数的形参

main(intargc,*argv[])或main(intargc,**argv);

其中argc是命令行中的参数个数(可执行文件名本身也算一个)argv是一个指向字符串的指针数组,用来存放命令行中各个参数的首地址。

23.结构体

structstudent{ 

longintnum;

char*name;

floatscorce[3];

}stud1,stud2;

structstudentstud3,stud4;

结构体的引用:

结构体变量名.成员名如:

stud1.num=101;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 初中作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1