完整word版C语言基础知识大全文档格式.docx
- 文档编号:16523468
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:43
- 大小:113.98KB
完整word版C语言基础知识大全文档格式.docx
《完整word版C语言基础知识大全文档格式.docx》由会员分享,可在线阅读,更多相关《完整word版C语言基础知识大全文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
a)由于在赋值符“=”右边的表达式也可以又是一个赋值表达式。
下述形式:
变量=(变量=表达式);
该语句是成立的,从而形成了嵌套的情形。
其展开后的一般形式为:
变量=变量=⋯=表达式;
a=b=c=d=e=5;
按照赋值运算符的右结合性,因此实际上等效于:
e=5;
d=e;
c=d;
b=c;
a=b;
b)注意在变量声明中给变量赋初值和赋值语句的区别给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其他同类变量之间仍必须用逗号隔开,而赋值语句则必须用分号隔开。
inta=5,b,c;
c)在变量声明中,不允许连续给多个变量赋初值。
如下述说明就是错误的:
inta=b=c=5;
正确写法为:
inta=5,b=5,c=5;
但是,赋值语句允许连续赋值。
d)注意赋值表达式和赋值语句的区别。
赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。
下述语句是合法的:
If((x=y+7)>
0)z=x;
语句功能为若表达式x=y+5大于0则z=x。
但是,下述语句是错误的:
If((x=y+7;
)>
因为x=y+7;
是语句,不能出现在表达式中。
实例:
#include“stdafx.h”
voidmain()
{
inti_Tmp,i_Type=8;
floatf_Tmp;
doubled_Tmp;
charc_Tmp;
d_Tmp=d_Tmp=f_Tmp=12;
f_Tmp=i_Type;
i_Tmp=i_Type+3;
printf("
a=%d,b=%d,c=%.3f,d=%.6lf"
i_Tmp,i_Type,f_Tmp,d_Tmp);
}
参考书目:
1.(美)KebbethA.reek.《C与指针》29-40
2.H.M.DeitelP.J.Deitel等《howtoprogramSecondEdition》19-23
2.算术运算符及使用方式
C语言提供了最基本的算术运算符,如下表:
运算符
含义
举例
结果
+
加法运算符
a+b
a和b的和
-
减法运算符
a-b
a和b的差
乘法运算符
a*b
a和b的乘积
/
除法运算符
a/b
a除b的商
%
求余运算符
a%b
a除b的余数
++
自加运算符
a++,++a
a自加1
--
自减运算符
a--,--a
a自减1
1、+、-、*、/都适用于浮点类型和整数类型,当两个操作数都为整数时进行整数运算,其余情况则进行double型运算;
当/除法运算符的两个操作数为整数时,结果为整数,舍去小数部分,例如5/3的结果为1;
%求余运算符只接受两个整型操作数的运算,结果为余数
2、++、--:
作用是使变量自加1或自减1,例如i++、++i,都是使i的值加1,但其执行的步骤是不同的。
inti=3,j;
j=i++;
//i的值为4,j的值为3
j=++i;
//i的值为4,j的值为4
可见当变量在左侧时,先进行赋值运算再进行自加1操作,当变量在右侧时,先进行自加1操作再进行赋值运算。
3、在赋值运算符之前加上算术运算符既构成复合运算符,例如:
a+=b,等价于a=a+b。
-=、*=、/=也是如此。
3.位运算符及使用方式(<<、>>、~、|、&
、^)
位运算符是用来对二进制位进行操作,如下表:
<
左移
>
右移
取反
|
按位或
&
按为与
^
按为异或
、>
:
移位运算符,例如左移运算符:
inti=3;
i=i<
4;
3的二进制位为00000011,左移4位的结果为00110000,其操作中高位舍弃、低位补0,既i=48,等同于i乘以2的4次方。
右移运算符则有所不同,操作中是低位舍弃,高位则有两种补位方式。
一种为逻辑移位,高位补0;
另一种为算术移位,当符号位为1时高位全部补1,当符号位为0时则高位全部补0。
具体使用哪种移位方式则取决于当前的编译环境。
~:
取反运算符,为单目运算符,其操作是对操作数的二进制位按位求反,既1变0,0变1。
例如i=5,二进制位为00000101,取反的结果为11111010。
在计算机系统中,数值一律用补码来表示和存储,其中最高位为符号位,用0表示正,1表示负。
补码的规定如下:
a)对正数来说,最高位为0,其余各位代表数值本身,例如14的补码为00001110;
对负数而言,则将该数绝对值的补码按位取反,再加1,得
该数的补码,既-i=~i+1。
例如-14的补码为14的二进制00001110取反加1得11110010。
b)|、&
、^:
均为双目运算符,对操作数的二进位进行运行,且操作数以补码的方式出现。
c)|按位或,两个对应的二进位至少有一个为1则为1,否则为0;
按位与,两个对应的二进位都为1则为1,否则为0;
^按位异或,两个对应的二进位不同则为1,否则为0。
a=5;
(00000101)b=14;
(00001110)a|b=15;
(00001111)a&
b=4;
(00000100)a^b=11;
(00001011)
4.关系运算符及使用方式(>
、>
=、<
、<
=、==、!
=)
大于
=
大于或等于
小于
小于或等于
==
等于
!
不等于
关系运算符用于比较两个数值之间的关系,例如:
a>
3为关系表达式,大于号为关系运算符,当表达式成立时,“a>
3”的值为“真”,当“a>
3”不成立时,
“a>
3”的值为“假”。
其中应当注意的是关系表达式的返回值为整型值,而不是布尔型。
表达式为真时返回值为1,表达式为假时返回值为0。
5.逻辑运算符及使用方式(&
、||、!
)
逻辑与
a&
b
a,b都为真则结果为真,否则为假
||
逻辑或
a||b
a,b至少有一个为真则结果为真,否则为假
逻辑非
!
a
当a为真则结果为假,当a为假则结果为真
其中应当注意逻辑或,例如a||b,当a为真时,C语言中直接跳过对b的判断,其返回值为“真”。
当一个表达式包括几种运算符时,则以运算符的优先级对表达式进行运算,表达式的优先级如下:
优先级
运算符类型
说明
1
初等运算符
()、[]、->、.
2
单目运算符
、~、++、--、*(指针运算符)、&
(取地址运算符)
3
算术运算符
先乘除后加减
4
关系运算符
>、>=、<、<=、==、!
=
5
逻辑运算符
、||
6
条件运算符
三目运算符,例如?
7
赋值运算符
8
逗号运算符
6.指针的概念与使用
1)指针的定义
指针就是变量的地址,是一个常量。
定义指针的目的就是为了通过指针访问内存单元。
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。
指针变量定义的一般形式为:
存储类型数据类型*指针变量名
2)指针变量运算符
1、取地址运算符:
&
该运算符表示的是对&
后面的变量进行取地址运算。
例:
inta;
则&
a表示取变量a的地址,该表达式的值为变量a的首地址。
2、指针运算符:
*该运算符也称为“取内容运算符”,后面接一个指针变量。
表示的是访问该指针变量所指向的变量,即访问指针所指向的存储空间中的数据。
inta=7;
int*p;
p=&
a;
则*p表示指针变量p指向变量a,即*p就是a,所以*p=7。
一个指针变量p在程序中通常有如下表示形式:
p:
指针变量,它的内容是地址量;
*p:
指针所指向的变量,是指针所指向的内存空间中的数据;
指针变量所占存储空间的地址;
【例1】分析程序的运行结果
源程序如下:
#include<
stdio.h>
voidLocate()
inti_a;
int*pst_a;
printf("
\n请输入i_a的值:
"
);
scanf("
%d"
&
i_a);
pst_a=&
i_a;
i_a的值为:
%d\n"
i_a);
pst_a的值为:
%x\n"
pst_a);
*pst_a的值为:
*pst_a);
pst_a);
\n"
运行结果:
请输入i_a的值:
3
12fe8c
12fe80
以上实例中,12fe8c是pst_a的值,也就是i_a的地址;
12fe80是pst_a的地址;
两者有区别,不能混为一谈。
3)地址与指针的概念指针可以有效地表示复杂的数据结构;
动态分配内存;
方便的使用字符串;
有效而方便地使用数组;
能直接处理内存地址。
如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。
系统根据程序中定义的变量的类型,分配一定长度的空间。
例如,一般微机使用的C系统为整形变量分配两个字节,为实型变量分配4个字节。
内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
在地址所标志的内存单元中存放数据,这相当于旅馆中各个房间中居住旅客一样。
在程序中一般通过变量名对内存单元进行存取操作,这称作“直接访问”,还可以采用另一种“间接访问”方式,将变量的地址存放在另一个变量中。
所谓“指向”就是通过地址来体现的,由于通过地址能找到所需的变量单元,我们可以说,地址“指向”该变量单元,因此在C语言中,将地址形象化的称为“指针”。
意思是通过它能找到以它为地址的内存单元。
一个变量的地址成为该变量的“指针”。
如果有一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。
4)变量的指针和指向变量的指针变量变量的指针就是变量的地址。
存放变量地址的变量是指针变量,用来指向另一个变量。
为了表示指针变量和它指向的变量之间的关系,用“*”符号表示“指向”。
定义指针变量的一般形式为:
基类型*指针变量名;
5)数组与指针
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占有存储单元,它们都有相应的地址。
指针变量也可以指向数组元素。
6)空间操作函数malloc、freeC语言提供了两个函数,malloc与free,分别用于执行动态内存分配与释放。
这些函数维护一个可用内存池。
当一个程序另外需要一些内存时,它就调用malloc函数从内存池中提取一块合适的内存,并返回一个指向这块内存的指针。
这块内存此时并没有以任何方式进行初始化,使用时需手动初始化。
这两个函数的原型如下所示,它们都在头文件stdio.h中声明。
void*mallloc(size_tsize);
Void*free(viod*pointer);
malloc的参数就是需要分配的内存字节数。
如果内存池中的可用内存可以满足这个需要,malloc就返回一个指向被分配的内存块起始位置的指针,如果系统无法向malloc提供更多的内存,malloc就会返回一个NULL指针。
free的参数必须要么是NULL,要么是一个先前从malloc或其他空间申请函数返回的值。
malloc的一般用法基类型*=(基类型)*Malloc(数量*sizeof(基类型));
7)动态数组动态数组是指在声明时没有确定数组大小的数组,即忽略方括号中的下标;
当使用时可用malloc语句重新指出数组的大小。
使用动态数组的优点是可以根据用户需要,有效利用存储空间。
动态数组的内存空间是从堆上分配的。
是通过执行代码而为其分配空间。
当程序执行到这些语句时,才为其分配空间。
程序员自己释放内存。
遵循原则:
申请的时候从外层往里层,逐层申请;
释放的时候从里层往外层,逐层释放。
【例2】:
一维数组的动态开辟与释放:
例3】:
二维数组的动态开辟:
7.数组
数组是构造类型,是一组具有相同类型数据的有序集合。
每个数据成为数组的元素,用一个统一的数组名和下标来唯一地确定数组中的元素。
一维数组的声明方式为:
类型标识符>
数组名>
[常量表达式]类型标识符是任一种基本数据类型或构造数据类型;
数组名由用户自定义表示存储空间的地址;
常量表达式表示数组元素的个数,也是数组的长度。
inta[6];
表示一个整型、数组名为a、长度为6的一维数组。
(2)一维数组的引用形式:
下标法:
数组名[下标]
a[i];
或p[i];
a为数组名,p为指向数组的指针变量。
注:
C语言中不能依次引用整个数组,只能逐个引用数组中的各个元素。
下标就是被访问的数组元素在所定义的数组中的相对位置。
下标为0表示的是数组元素在数组的第一个位置上,下标等于1表示的是数组元素在数组的第二个位置上,依次类推。
inta[10];
a[0]=100;
//正确a[10]=100;
//不正确,下标越界例如:
下标法:
intmain()
for(inti=0;
i<
10;
i++)
a[i]=2*i;
printf(“%d\t”,a[i]);
return0;
指针法:
*(a+i)或*(p+i);
a是数组名,p为指向数组的指针变量。
例如:
int*p=a;
inti;
for(i=0;
i++)a[i]=2*i;
for(i=0;
printf(“%d\t”,*(p+i));
二维数组的声明方式为:
<
[常量表达式1][常量表达式2]:
二维数组与一维数组的区别在于多出[常量表达式2]。
[常量表达式1]是第一维,常称为行;
[常量表达式2]是第二维,也就是列。
inta[3][5];
表示一个3行5列的二维数组;
数组元素的个数为:
3*5=15个。
二维数组的引用形式:
数组名[下标][下标]注:
二维数组在引用时和一维数组一样,只能逐个引用数组中的各个元素。
sz_A[5][6]下标可以是整数表达式,如sz_A[8-5][2*3-1]。
不要写成sz_A[2,3]、sz_A[8-5,2*3-1]形式。
注意:
严格区分定义数组时用的sz_A[5][6]和引用元素时用的sz_A[5][6]
sz_A[5][6]的5和6是下
的区别。
前者sz_A[5][6]用来定义数组的维数,后者标,代表的是数组中的某一个元素。
【例2】分析程序的运行结果
intsz_Array[6];
//一维数组
intsz_DlArray[3][5];
//二维数组
inti_dla;
inti_dlb;
//一维数组
for(i_a=0;
i_a<
6;
i_a++)
sz_Array[i_a]=i_a*2+2;
\n输出一维数组元素为:
\n"
for(i_a=0;
%d\t"
sz_Array[i_a]);
//二维数组
for(i_dla=0;
i_dla<
3;
i_dla++)
for(i_dlb=0;
i_dlb<
5;
i_dlb++)
sz_DlArray[i_dla][i_dlb]=i_dla+i_dlb;
\n输出二维数组元素为:
for(i_dlb;
%d"
sz_DlArray[i_dla][i_dlb]);
运行结果为:
输出一维数组元素为:
24681012
输出二维数组元素为:
12345
23456
34567
45678
可以通过行指针来引用二维数组元素。
定义行指针变量:
int(*p)[3],指针p是指向一个由3个元素所组成的整型数组指针例如:
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
int(*p)[4]=a;
for(intj=0;
j++)
printf(“%d\t”,p[i][j]);
printf(“\n”);
1.C++语言程序设计教程与实验(第二版)温秀梅丁学钧李建华主编
2.C/C++程序设计教程张世民主编
8.字符数组
1)字符数组的定义与赋值字符数组是一串字符的集合,其数组元素为字符型。
字符数组的赋值形式:
char数组名[常量表达式]=“字符串”;
或char数组名[常量表达式]={“字符串”};
charsz_A[5]={‘s'
‘t'
‘u'
‘d'
‘y'
};
定义数组sz_A,包含5个元素,其在内存中的存放情况为:
szA[0]szA[1]szA[2]szA[3]szA[4]
s
t
u
d
y
则各元素赋值如下:
sz_A[0]=‘;
s'
sz_A[1]=‘;
t'
sz_A[2]=‘;
u'
sz_A[3]=‘;
d'
sz_A[4]=‘y'
如果花括号中的字符个数大于数组长度,编译系统就会报错,如果花括号中的字符个数小于数组长度,其余元素则由系统自动定义为空字符,即‘\0'
。
‘\0作'
为字符串的结束标志,因此在定义数组长度时,应在字符串原有的长度上加1,为字符串结束标志预留空间。
charsz_A[6]={‘s'
定义数组sz_A,包含6个元素,其在内存中的存放情况为:
sz_A[0]sz_A[1]sz_A[2]sz_A[3]sz_A[4]sz_A[5]
\0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 语言 基础知识 大全
![提示](https://static.bdocx.com/images/bang_tan.gif)