C语言语法总结.docx
- 文档编号:2750210
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:19
- 大小:26.64KB
C语言语法总结.docx
《C语言语法总结.docx》由会员分享,可在线阅读,更多相关《C语言语法总结.docx(19页珍藏版)》请在冰点文库上搜索。
C语言语法总结
1.C语言的数据类型
基本类型
a.整型:
整型int Visualc++6.0中占4个字节;Turboc2.0占2个字节取值:
-2147483648-2147483647
短整型shortint2个字节取值:
-32768-32767
长整型longint 4个字节取值:
-2147483648-2147483647
无符号整型unsignedint4个字节取值:
0-4294967295
无符号短整型unsignedshortint2个字节
无符号长整型unsignedlongint 4个字节
注:
对于不同的编译环境,整型在内存中所占的字节数也不一样。
b.字符型:
char(\n回车\t下一制表位置\r回车\'单引号\\:
反斜杠字符"\")
注:
对于c语言的任何一个字符都可用转义字符来表示
如:
\101表示字符"A",\134表示反斜杠,\XOA表示换行
对于字符串常量内存字节数要加1,用来存放字符结束标志符"\0"
c.实型:
单精度float占4个字节,32位。
取值为:
3.4E-38~3.4E+38,可提供6到7位有效数字
双精度double占8位字节,64位。
取值:
1.7E-308~1.7E+38
d.枚举:
enum
构造类型
a.数组array
b.结构体struct
c.共用体union
指针类型*
空类型void
2.输入输出函数
printf(格式控制字符串,输出列表)//格式控制字符串可由格式字符串(以%开头)和非格式字符串(原样输出)组成.
scanf(格式控制字符串,地址表列)
putchar()//字符数据的输出等同与printf(%c,.)位于
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’结束的字符数组。
注:
在求字符串长度时,不包含结束符'\0'。
但是sizeof却要包含。
如:
charc[]="string";
charc1[]={'s','t','r','i','n','g','\0','\0'};
printf("%d\n",sizeof(c));//7,默认在string后加'\0'
printf("%d\n",sizeof(c1));//8,对于字符数组只能自己加结束符
printf("%d\n",strlen(c));//6求字符串长度时,不包含结束符'\0'
printf("%d\n",strlen(c1));//6求字符串长度时,不包含结束符'\0'
常用的字符串处理函数(在stdio.h中与string.h中):
puts(字符数组名)---把字符数组中的字符串输出到显示器。
gets(字符串数组名)--从输入设备得到字符串。
strcat(字符数组名1,字符数组名2)--把字符数组中2中的字符串连接到字符数组1中字符串的后面,并删除字符串1后的串标志"\0";
strcpy(字符数组名1,字符数组名2)--把字符数组2中的字符串复制到字符数组1中,串结束标识'\0'也一同复制。
strcmp(字符数组名1,字符数组名2)--按照ASCII码顺序比较两个数组中的字符串,并由函数返回比较结果。
strlen(字符数组名)---返回字符实际长度(不含字符'\0')
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
注意:
在没赋初值时,指针变量的内容是不确定的。
如果此时引用指针指向的变量,将会产生不可预料的后果。
如:
int*p;*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("%d\n",SQ(i++));//输出为:
1,9,25
printf("%d\n",SQ(++i)); //输出为:
9,25,49 注:
对SQ(++i)首先用((++i)*((++i))来替换
}
}
14.文件包含
一个源程序通过#include命令把另外一个源文件的全部内容嵌入到源程序中来。
在编译时并不是作为两个文件连接,而是作为一个源程序编译,得到一个目标文件。
格式:
#include"文件名"
注:
#include"file.h"首先在使用包含文件的源文件所的目录查找file.h文件,若没有找到指定的文件,再到系统指定的标准目录查找。
#include
15.条件编译
希望部分行在满足一定条件才进行编译,即按不同的条件去编译不同的程序部分,因而产生不同的目标代码条件。
使用条件编译功能,为程序的调试和移植提供了有力的机制,使程序可以适应不同系统和硬件设置的通用性和灵活性。
#ifdef标识符
程序段1
#else
程序段2
#endif
例:
#defineR1
#include
main()
{
doublec,r,s;
printf("请输入圆的半径或矩形的边长:
\n");
scanf("%d",&c);
#ifdefR
r=3.14*c*c;
printf("圆的面积=%f\n",r);
#else
s=c*c;
printf("矩形面积=%f\n",s);
#endif ..
}
16.指针型函数
指函数返回指针值的函数。
格式:
类型说明符*函数名([参数列表]){} 多用于构造类型数据结构(创建一个链表、返回指向头结点的指针)。
例:
#include
int*max(int*a,int*b)
{
return(*a>*b)?
a:
b;
}
voidmain()
{
inta,b,*p;
scanf("%d,%d",&a,&b);
p=max(&a,&b);
printf("max=%d",*p);
}
17.指向函数的指针
C语言规定,函数名就表示该函数所点内存区域的首地址,将函数首地址赋给某一指针变量,则通过该指针变量就可以调用这个函数。
这种指向函数的指针变量就称为函数指针变量。
定义:
类型标识符(*指针变量名)([参数列表]);
类型标识符:
表示指针所指函数的返回值的类型。
(*指针变量名)表示"*"后面定义的变量为指针变量,括号表示指针变量所指的是一个函数,而参数列表则列出函数的类型。
用函数指针变量调用函数格式:
(*指针变量名)(实参表)或指针变量名(实参表)
例:
#include
#include
floatarea(inta,intb)
{
return(float)a*b/2;
}
floatlength(inta,intb)
{
return(float)sqrt(a*a+b*b);
}
voidmain()
{
intm,n;
floats,l;
float(*f)(int,int);//定义一个指向函数的指针变量
scanf("%d,%d",&m,&n);
f=area;
s=(*f)(m,n);
f=length;
l=(*f)(m,n);
printf("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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 语法 总结