收藏 分销(赏)

C语言读书重点笔记.doc

上传人:天**** 文档编号:2993092 上传时间:2024-06-12 格式:DOC 页数:29 大小:57.54KB 下载积分:10 金币
下载 相关 举报
C语言读书重点笔记.doc_第1页
第1页 / 共29页
C语言读书重点笔记.doc_第2页
第2页 / 共29页


点击查看更多>>
资源描述
第一章 概述+ s8 j+ t( q" C# z" C 1. C语言特点% b9 j1 p0 l$ ^# T/ }5 C1 d ①语言简洁、紧凑,使用以便、灵活。共有32个核心字,9种控制语句。 ②运算符丰富,公有34种运算符。 ③数据构造丰富,数据类型有:整型、实型、字符型、数组、指针、构造体、共用体等。 ④具备构造化控制语句(如if…else、while、do…while、switch、for) ⑤语法限制不太严格,程序设计自由度大。. t- O,P1 i- J!h" X:P x1 T ⑥容许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。 ⑦生成目的代码质量高,程序执行效率高。;{& C/ S!\( t ⑧可移植性好。 2. C语言用途( w# K( ^9 j- b,I C虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面,C有明显优势。当前诸多大型应用软件也用C编写。 9 g2 ?2 \1 S3 d 第二章 数据类型、运算符与表达式 1. C数据类型 C数据类型涉及:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、构造体类型、共用体类型、指针类型和空类型。,e* a!R+ d:w% B7 J 2. 常量与变量 常量其值不可变化,符号常量名通惯用大写。变量其值可以变化,变量名只能由字母、数字和下划线构成,且第一种字符必要为字母或下划线。否则为不合法变量名。变量在编译时为其分派相应存储单元。0 ` S8 k9 u/ O @ 3. 整型数据 整型常量表达办法:十进制不用说了,八进制以0开头,如0123,十六进制以0x开头,如0x1e。 整型变量分为:基本型(int)、短整型(short int)、长整型(long int)和无符号型。不同机器上各类数据所占内存字节数不同,普通int型为2个字节,long型为4个字节。% {8 _ f!a8 ~6 O3 l 4. 实型数据 实型常量表达形式:十进制形式由数字和小数点构成(必要有小数点),如:0.12、.123、123.、0.0等。指数形式如123e3代表123×10三次方。 实型变量分为单精度(float)和双精度(double)两类。在普通系统中float型占4字节,7位有效数字,double型占8字节,15~16位有效数字。 5. 字符型数据 o,g( G7 B7 @/ r( m* a 字符变量用单引号括起来,如'a','b'等。尚有某些是特殊字符常量,如'\n','\t'等。分别代表换行和横向跳格。2 e- x+ y5 {" U6 V u% F8 l/ x) a 字符变量以char 来定义,一种变量只能存储一种字符常量。 字符串常量是由双引号括起来字符序列。这里一定要注意'a'和"a"不同,前者为字符常量,后者为字符串常量,c规定:每个字符串结尾加一种结束标志'\0',事实上"a"包括两个字符:'a'和'\0'。5 d4 r4 g7 z( w( g6 b- K" A 6. 数值型数据间混合运算5 A:N/ {/ d" f0 `( h 整型、字符型、实型数据间可以混合运算,运算时不同类型数据要转换成同一类型再运算,转换规则: char,short -> int -> unsigned -> long -> double <- float3 X- w2 Y6 X Q6 k- m3 B 7. 运算符和表达式7 l. I+ `6 N3 c( b. n4 z c运算符涉及: 算数运算符( + - * / % ) # H8 {( s" C6 N* l$ T' `# t;R 关系运算符( > < == >= <= != )) `( [ a) K/ x% m,A6 B 逻辑运算符( !&& || ) 位运算符( << >> ~ | ^ & )4 a:X# Q:d;U* v 赋值运算符( = ) 条件运算符( ?:);O5 E:j2 X5 w1 Y;Y3 s9 Y5 |5 L 逗号运算符( ,) 指针运算符( * & ) 求字节数( sizeof ) 强制类型转换(类型)# R" O5 p!t;G Q1 n" g 分量运算符( . -> )" A/ Y2 h( O# N) q!\* p 下标运算符( [ ] ) 其他运算符( 如函数调用运算符( ) )1 p/ @/ B. f,M,Q b,R 自增自减运算符( ++ -- )注意:++i和i++不同之处,++i使用i之前先使i加1,i++使用i之后,使i加1。 逗号表达式求解过程:先求解表达式1,再求解表达式2,整个表达式值是表达式2值。+ v!k' }:r- a$ E) X7 i 1 i \' F- [" e5 {,u 第三章 最简朴c程序设计 1.c9种控制语句:7 F6 p9 _$ K:f9 E# O0 h9 T% n5 a if() ~ else~ for()~5 \- W4 q8 G* l) h7 b while()~ do~while() continue9 U& x" {1 e( X# b i* z break switch goto# O$ F/ u/ B s!c:}) T;X return) B. a$ V" B. b% c1 c,H1 w 程序三种基本构造:顺序构造,选取构造,循环构造 3 ?2 x8 e:^ w,F | 2.数据输出 c语言不提供输入输出语句,输入输出操作是由c库函数完毕。但要包括头文献stdio.h。:v$ }- y( r9 Y putchar( ) 向终端输出一种字符 [7 O5 s6 s9 A3 u4 K printf( )格式字符: ① d格式符 用来输出十进制整数- |3 R/ Z c0 T0 l %d 按整型数据实际长度输出 %md 使输出长度为m,如果数据长度不大于m,则左补空格,如果不不大于m,则输出实际长度 %ld 输出长整型数据& G5 q& H% g9 j& p3 w5 P5 L ② o格式符 以八进制形式输出整数 ③ x格式符 以十六进制形式输出整数 ④ u格式符 用来输出unsigned型数据,以十进制形式输出7 S0 A0 P$ D% n!W( B ⑤ c格式符 用来输出一种字符 ⑥ s格式符 输出一种字符串 %s 输出实际长度字符串 %ms 输出串占m列,如果串长度不大于m,左补空格,如果不不大于m,实际输出8 N3 J w2 [;O" ~" z0 a %-ms输出串占m列,如果串长度不大于m,右补空格,# C {+ Q9 j/ j2 J %m.ns 输出占m列,但只取字符串中左端n个字符并靠右对齐7 c. i5 ~& d9 }1 F# h3 B& D' Y %-m.ns m、n含义同上,靠左对齐,如果n>m,则m自动取n值 ⑦ f格式符 以小数形式输出实数8 |+ g" z( z+ x) n8 ^' J% Z %f 整数某些所有输出,小数某些输出6位 %m.nf 输出数据共占m列,其中有n位小数。如果数值长度不大于m,左补空格 " q+ K2 A% c& ?2 d,`. V) ?# K %-m.nf 同上,右补空格 ⑧ e格式符 以指数形式输出实数 %e 系统指定6位小数,5位指数(e+002 ) ⑨ g格式符 输出实数,依照数值大小,自动选f格式或e格式2 J' S o:q' T,o!v9 E 3.数据输入8 j$ Q:|5 @2 z- V getchar( ) 从终端输入一种字符,`!I0 O2 _$ r4 r1 T!f8 Q/ _& n scanf( 格式控制,地址列表) 原则C scanf中不使用%u,对于unsigned型数据,以%d或%o或%x输入。%后*,用来跳过它相应数据。输入数据时不能规定精度如scanf( "%7.2f",&a );是不合法。 第四章 逻辑运算和判断选用控制& m" O8 n1 I* ]3 y2 p6 H# r 1. 关系运算符: c提供6种关系运算符(> < <= >= == != )前四种优先级高于后两种。:t8 N7 @- ~6 x2 v& P,b 2. If语句 D0 G' d9 L a. f,^ C提供了三种形式if语句 If(表达式) 语句 If(表达式) 语句1 else 语句2 If(表达式1) 语句18 B& |/ O+ M1 o4 Z Else if(表达式2) 语句2 …- J4 t3 y2 m" L:@5 L0 T:Z5 T else 语句n 3. 条件运算符& ~8 f* q,R' C (a>b)?a:b 条件为真,表达式取值a,否则取值b:v8 g;f) x4 ]+ w/ E* s% s 4. Switch语句 Switch(表达式)& }) M' c$ H4 F8 a {:U4 ?' ^+ n9 A* Q case 常量表达式1:语句1;break;7 S* @+ F% ?3 L& o0 g case 常量表达式2:语句2;break;    … case 常量表达式n:语句n;break;7 y9 k6 z8 z7 ~,O!Z   default :语句n+1; } & b;\0 o1 y;y+ t * d J* D8 U;e;m x 第五章 循环控制 1. 几种循环语句) H) _. F/ P2 f0 B,? goto语句(现已很少使用) while语句 先判断表达式后执行语句 do-while语句 先执行语句后判断表达式!?5 V;V y3 ^,d) H for语句) e9 k" I3 e( b8 | E$ S( K!?9 ^% K 2. Break语句和continue语句 Break语句用于跳出循环,continue用于结束本次循环。 " ~:}5 P% ^& G" C9 M$ F1 w 第六章 数组6 R$ [7 }. V4 N,p( M 1. 一维数组3 b& e' a!r. A4 \) x- M) B c规定只有静态存储(static)和外部存储(extern)数组才干初始化。给数组初始化时可以不指定数组长度。4 m1 z5 C- A9 i" ]4 i!P 2. 二维数组5 q9 w3 ^. Z6 ^8 T$ M( p 3. 字符数组 某些字符串解决函数1 A* `,G) b!l/ [ V7 e puts(字符数组) 将一种字符串输出到终端。( n' n5 a% A' D U;y- s' h8 x gets(字符数组) 从终端输入一种字符串到字符数组,并且得到一种函数值,为该字符数组首地址 strcat(字符数组1,字符数组2) 连接两个字符数组中字符串,数组1必要足够大。 Strcpy(字符数组1,字符串2)  将字符串2拷贝到字符数组1中。/ j( f!x% X# f) [0 I+ l Strcmp(字符串1,字符串2) 比较字符串,相等返回0,字符串1>字符串2,返回正数,不大于返回负数。 Strlen(字符数组) 求字符串长度。3 w:@1 Y- M& r Strlwr( 字符串) 将字符串中大写字母转换成小写 Strupr( 字符串)  将字符串中小写字母转换成大写 以上是某些比较惯用字符串解决函数。 6 k2 A. R7 E5 \9 O( _;`!? ;j# i& k% J6 C# J9 u2 w 第七章 函数 u0 G2 @!N;S 1. 关于形参和实参阐明 ① 在函数被调用之前,形参不占内存 ② 实参可以是常量、变量或表达式1 l4 I2 |3 R$ L ③ 必要指定形参类型:_% Z. M) J1 v. Q( A5 \2 V$ b I5 n4 z ④ 实参加形参类型应一致1 n!z8 a& y- D- |% W- B ⑤ 实参对形参数据传递是"值传递",即单向传递4 Y+ N% h- @;g" K,r/ a 2. 函数返回值 如果想让函数返回一种值,在函数中就要用return语句来获得,在定义函数时也要对函数值指定类型,如果不指定,默认返回整型。- ^# l% q0 N4 I H 3. 函数调用 1)注旨在函数调用时实参和形参个数、类型应一一相应。对实参表求值顺序是不拟定,有系统按自左至右,有系统则按自右至左顺序。这一点要注意。' x+ s!L:s4 R4 ~+ c 2)函数调用方式:函数语句,函数表达式,函数参数 3)如果主调函数和被调函数在同一文献中,并且主调函数在前,那么普通要在主调函数中对被调函数进行阐明。除非:(1)被调函数返回值类型为整型或字符型(2)被调函数出当前主调函数之前。% C- _' m( `,y" L 4)对函数阐明和定义是不同,定义是指对函数功能确立,涉及指定函数名,函数值类型,形参及其类型、函数体等。阐明则只是对已定义函数返回值类型进行阐明,只涉及函数名、函数类型以及一种空括弧,不涉及形参和函数体。3 e" X/ l$ l$ t- t) q3 O1 t( O 5)c语言容许函数递归调用(在调用一种函数过程中又浮现直接或间接调用该函数自身)。 4. 数组作为函数参数 1)数组元素作为函数参数 和普通变量相似 2)数组名作参数应当在主调和被调函数分别定义数组,形参数组大小可以不定义。注意:数组名作参数,不是单向传递。:N6 Y% Z/ L4 X7 g$ T8 ~!p8 k 3)多维数组作参数,在被调函数中对形参数组定义时可以省略第一维大小阐明,但不能省略第二维或更高维阐明。 5. 局部变量和全局变量 从变量作用域角度分,变量可分为局部变量和全局变量。2 k6 v0 O9 g/ ]8 e. ]/ ~ 1)内部变量(局部变量) 在一种函数内定义,只在函数范畴内有效变量。3 k9 d3 @/ W# S!|& N    2)外部变量(全局变量) 在函数外定义,可觉得本文献其他函数所共用,有效范畴从定义变量位置开始 9 y- u/ q9 R% X" ]!M" D      到本文献结束。建议尽量少使用全局变量,由于它在程序所有执行过程中都占用1 `' S. j$ R6 z!m$ ^8 N      资源,并且使函数通用性减少了。如果在定义外部变量之前函数要想使用该      外部变量,则应在该函数中用extern作外部变量阐明。* x( _6 u" }/ i$ b% F7 x0 ] 6. 动态存储变量与静态存储变量 从变量值存在时间(生存期)角度来分,可分为静态存储变量和动态存储变量。静态存储指在程序运营期间给变量分派固定存储空间,动态存储指程序运营期间依照需要动态给变量分派存储空间。 C语言中,变量存储办法分为两大类:静态存储类和动态存储类,详细涉及:自动(auto),静态(static),寄存器(register),外部(extern)。0 N& B7 H) q9 G( S4 a q 1) 局部变量存储方式2 g!|( B,I r 函数中局部变量如不作专门阐明,都之auto,即动态存储,auto可以省略。局部变量也可以定义为static,这时它在函数内值是不变。静 态局部变量如不赋初值,编译时系统自动赋值为0,动态局部变量如不赋初值,则它值是个不拟定值。C规定,只有在定义全局变量和局部静态变量时才干对数 组赋初值。为提高执行效率,c容许将局部变量值放在寄存器中,这种变量叫register变量,要用register阐明。但只有局部动态变量和形式参数 可以作为register变量,其他不行。3 q6 ` A. z& U 2) 全局变量存储方式 全局变量在 函数外部定义,编译时分派在静态存储区,可以在程序中各个函数所引用。各种文献状况如何引用全局变量呢?如果在一种文献定义全局变量,在别文献引用, 就要在此文献中用extern对全局变量阐明,但如果全局变量定义时用static话,此全局变量就只能在本文献中引用了,而不能被其他文献引用。 3) 存储类别小结7 r5 M4 i% @" r. l6 J& Z 从作用域角度分,有局部变量和全局变量 局部变量:自动变量,即动态局部变量(离开函数,值就消失)8 _0 e/ }6 _" J      静态局部变量(离开函数,值仍保存)  寄存器变量(离开函数,值就消失) ( h7 }) s4 S1 t:X;Y# D) Q/ q  (形参可定义为自动变量和寄存器变量) 全局变量:静态全局变量(只限本文献引用)1 Q) j) d/ k* I4 P  全局变量(容许其他文献引用) 从存在时间分,有静态存储和动态存储0 |4 u# U( W& d4 Y c$ S 动态存储:自动变量(本函数内有效)$ W0 o!U& _- n b:h2 V" |  寄存器变量(本函数内有效)  形参) }3 I" @+ g3 j. w5 W 静态存储:静态局部变量(函数内有效)  静态全局变量(本文献内有效)  全局变量(其他文献可引用)9 |,B7 h* P1 w* T;N/ M3 N0 b3 t 从变量值存储位置分 静态存储区:静态局部变量   静态全局变量( {3 k7 n3 t) n 全局变量 动态存储区:自动变量和形参$ ]& H1 Q- V5 D3 Q!z 寄存器内:寄存器变量 7. 内部函数和外部函数 内部函数:只能被本文献中其他函数调用,定义时前加static,内部函数又称静态函数。3 X$ o;z;?2 E1 D j# A:B 外部函数:可以被其他文献调用,定义时前加extern,如果省略,则隐含为外部函数,在需要调用此函数文献中,普通要用extern阐明。 第八章 预编译解决 c编译系统在对程序进行普通编译之前,先进行预解决。c提供预解决功能重要有如下三种:1)宏定义 2)文献包括 3)条件编译!p& b7 R- r2 V. l3 j+ Y& B 1. 宏定义6 m4 D( @:N/ A1 { 不带参数宏定义 用一种指定标记符来代表一种字符串,形式:#define 标记符 字符串!y) G3 e6 F+ E" j 几点阐明:4 ?4 R. R2 R3 w4 w 1) 宏名普通用大写 2) 宏定义不作语法检查,只有在编译被宏展开后源程序时才会报错:j( Z5 d' E* B5 f5 ^6 s9 e3 p 3) 宏定义不是c语句,不在行末加分号 4) 宏名有效范畴为定义到本源文献结束 5) 可以用#undef命令终结宏定义作用域 `/ ~,p# D4 c 6) 在宏定义时,可以引用已定义宏名# e;C% d+ ]& L 带参数宏定义 定义形式:#define 宏名(参数表) 字符串 :q8 r1 B' s$ e' B;n X" M 这和函数有些类似,但她们是不同:;@0 t$ T1 j9 g 1) 函数调用时,先求实参表达式值,再代入形参,而宏只是简朴替代,并不求值5 [( q1 l" P' k:E* v- b) T 2) 函数调用是在程序运营时分派内存,而宏展开时并不分派内存,也没有返回值概念0 C# ]& D6 M# j. r;_ 3) 对函数中实参和形参都要定义类型,并且规定一致,宏名无类型,其参数也没有类型。. F/ a!h( f" R 4) 函数只有一种返回值,而宏可以得到几种成果4 G' {$ g5 U) g0 M1 ? f 5) 宏替代不占运营时间,只占编译时间,而函数调用占运营时间 2. 文献包括解决& s4 c( H6 C9 m #include "文献1" 就是将文献1所有内容复制插入到#include位置,作为一种源文献进行编译。:@8 Y9 L$ Z% M$ n8 o7 J- Q+ M 在#include命令中,文献名可以用" "也可以用< >,如果当前file1.c中包括file2.h文献," "表达系统先在file1.c所在目录中找file2.h,如果找不到,再按系统指定原则方式检索目录,< >表达系统直接按指定原则方式检索目录。因此用" "保险一点。 3. 条件编译 条件编译指不对整个程序都编译,而是编译满足条件那某些。条件编译有如下几种形式: 1)#ifdef 标记符& }$ d' I% |7 t5 r+ y5 v3 e   程序段1   #else 程序段2 #endif 它作用:当标记符在前面已经被定义过(普通用#define),则对程序段1编译,否则对程序段2编译。 $ \% i* o:y1 [/ j- R9 r9 |3 q" n 2)#ifndef 标记符 U& ]5 E' q' {1 W" R3 V$ \+ [# H+ E 程序段1$ {* i- `( i* r0 G( l #else' H* H6 }/ Y% V# n6 `. u* D4 F!s 程序段2# X2 Z;{* o- m1 R% H ` ] u% T #endif 它作用和#ifdef相反,当标记符没被定义过,对程序段1编译,否则对程序段2编译。 3)#if 表达式 {5 U+ O9 Q% ^. ]+ n3 ` 程序段1+ H% b+ x3 R6 w;T. a) @2 W9 w7 w   #else  程序段2) v# P7 J+ t;P;y# F!i #endif 它作用:当表达式值为真(非0)时,对程序段1编译,否则对程序段2编译。* U$ T) r/ Y,Z# F- E " ^,{9 R) v' Q$ O) }3 \ 0 r* N2 I2 ^:o;^( p- e( ~ 第九章 指 针   指针说白了就是地址。指针变量就是用来存储指针(地址)变量。6 D4 q,h ^:g,U8 ~+ S# ^ 1. 变量指针和指向变量指针变量& h8 W' h1 }8 w 读起来很拗口,说白了就是变量地址和用来存储变量地址地址变量。由于一种变量在编译时候系统要为它分派一种地址,如果再用一种变量来存储这个地址, 那么这个变量就叫做指向变量指针变量,也就是用来存储变量地址这样一种变量。所谓"指向"就是指存储××地址,如指向变量指针变量,"指向"就是 指用来存储变量地址,再如指向数组指针变量,"指向"就是指存储数组地址。只要理解了这个,指针也就不难了。此外,尚有指向字符串指针变量,指向 函数指针变量,指向指针指针变量等。 1) 指针变量定义 形式:类型标记符 *标记符 如:int *pointer;/ U( [" v6 p% L9 f 要注意两点:*表达pointer是个指针变量,在用这个变量时候不能写成*pointer, *pointer是pointer指向变量。一种指针变量只能指向同一种类型变量。如上面 pointer只能指向int型变量。4 ]!o% ]% L* e!g1 W9 ? 2)指针变量引用 两个关于运算符: & 取地址运算符 &a 就代表变量a地址 * 指针运算符  *a 就代表变量a值6 C. M% K$ d( X:b0 @ 2. 数组指针和指向数组指针变量 数组指针指数组起始地址,数组元素指针指数组元素地址。 1)指向数组元素指针变量定义与赋值7 c:w7 F* \;b$ x% g4 j( F* c 定义和指向变量指针变量定义相似,c规定数组名代表数组首地址,即第一种数组元素地址。 2)通过指针引用数组元素 咱们普通引用数组元素形式是a,如果用指针可以这样引用,*(a+i),或定义一种指针变量p,将数组a首地址赋给p,p=a;然后用*(p+i)引用。 注意:指针变量p指向数组a首地址,则p++指向数组a下一元素地址,即a[1]地址。:v* S/ G) P;V3 A5 T# t" Z 3)数组名作函数参数 形参数组和实参数组之间并不是值传递,而是共用同一段地址,因此在函数调用过程中如果形参值发生变化,则实参值也跟着变化。 2 y- L0 c:T3 j9 @& x:A9 c 4)指向多维数组指针和指针变量 以二维数组为居多。假设定义了一种二维数组a[3][4],那么 a代表整个二维数组首地址,也代表第0行首地址,同步也是第0行第0列元素首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行首地址。4 \- \) Z$ f. {- b3 d 假设a是一种数组首地址,那么如果a是一维,a+I代表第I个元素地址,如果a是二维,则a+I代表第I行首地址。 那么第一行第二列元素地址如何表达呢?a[1]+2或&a[1][2]或*(a+1)+2。 咱们只要记住:在二维数组中a代表整个数组首地址,a[I]代表第I行首地址,a[I]与*(a+I)等价就行了。只要运用纯熟了就没什么复杂了。 ( f0 a9 f6 r* T7 b3 h 5)指向由m个整数构成一维数组指针变量 如:int (*p)[4],p是一种指向包括4个元素一维数组,如果p先指向a[0],则p+1指向a[1],即p增值是以一维数组长度为单位,这里是4,举个例子:$ Q% S- g8 i4 K' D4 T3 z:S:n!_/ n 假设a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},p先指向a[0]也就是数组a首地址,那么p+1就是 a[1]首地址即元素9地址,由于在定义p时int (*p)[4],定义一维数组长度为4,因此p+1就等于加了一种一维数组长度4。 3. 字符串指针和指向字符串指针变量1 `# Y' c% d;g 1)字符串表达形式( u8 P/ _( `0 |1 m8 A- N4 I c中字符串有两种表达形式:一种是数组,一种是字符指针 char string[]="I love c!"; char *str="I love c!"; 其实指针形式也是在内存中开辟了一种数组,只但是数组首地址存储在字符指针变量str中,千万不要以为str是一种字符串变量。 2)字符串指针作函数参数( o+ w7 b' T7 j% X5 H2 i7 r 事实上字符串指针就是数组首地址。 3)字符指针变量与字符数组区别 ① 字符数组由若干元素构成,每个元素存储一种字符,而字符指针变量只存储字符串首地址,不是整个字符串$ H;r8 }& k- ^:G ② 对数组初始化要用static,对指针变量不用。+ r* k* t,C$ c. c" u ③ 对字符数组赋值,只能对各个元素赋值,不能象下面这样:5 W1 m1 a. k;^* U. O. X char str[14]; str="I love c!";6 }5 z4 |$ U3 n9 Q 对指针变量可以, % N" @# Q6 `6 P* r+ A% i char *str;9 p!R. }) z& a1 \# H str="I love c!";) _' z;~ \% M* i7 g 注意:此时赋给str不是字符,而是字符串首地址。 ④ 数组在定义和编译时分派内存单元,而指针变量定义后最佳将其初始化,否则指针变量值会指向一种不拟定内存段,将会破坏程序。如: char *a; scanf( "%s",a );这种办法是很危险,应当这样:+ K- L$ Z!w/ U char *a,str[10]; a = str;9 v3 W9 f:?3 V:e,B6 o scanf( "%s",a );这样字符指针就指向了一种拟定内存段。+ h2 R* ^0 K1 X* I# A/ b;\9 H;m) D ⑤ 指针变量值是可以变化,而字符数组名所代表字符串首地址却是不能变化。:l5 ~7 t6 R' v1 {,U 4. 函数指针和指向函数指针变量 一种函数在编译时被分派一 个入口地址,这个入口地址就称为函数指针。函数名代表函数入口地址,这一点和数组同样。咱们可以用一种指针变量来存储这个入口地址,然后通过该指针变 量调用函数。如:假设有一种求两者较大函数如下:int max( int x,int y ); 当咱们调用这个函数时可以这样: int c; c=max( a,b );这是普通调用办法,其实咱们可以定义一种函数指针,通过指针来调用,如: int (*p)();//注意指向函数指针变量定义形式 p=max;//此句就是将函数入口地址赋给函数指针变量p c=(*p)( a,b );. a,q!r& W& W% f5 B5 X 有些朋友可 能对(*p)()不大理解,其实它意思就是定义一种指向函数指针变量p,p不是固定指向哪个函数,而是专门用来存储函数入口地址变量。在程序中把 哪个函数入口地址赋给它,它就指向哪个函数。但要注意,p不能象指向变量指针变量同样进行p++,p-等无意义操作。 既然p是一种指针变量,那么就可以作为函数参数进行传递。其实函数指针变量最惯用用途之一就是作为函数参数传递到其他函数。这也是c语言中应用比较进一步某些了。1 b/ U!Q8 G8 p* G( p 5. 返回指针值函数$ b) i6 j0 U2 x* {( `1 i/ B 咱们懂得,一种函数可以带回一种整型值、字符值、实型值等,函数还可以带回一种指针型数据,即地址。这种函数定义形式如下: 类型标记符 *函数名(参数表) 如:int *a(x,y)返回一种指向整型指针 使用这种函数时候要注意:在调用时要先定义一种恰当指针来接受函数返回值。这个恰当指针其类型应为函数返回指针所指向类型。 这样函数比较难于理解,其实只要把它当做普通函数来解决就容易了。当咱们觉得指针难于理解时候,就把它暂时当做整型来看,就好理解多了。2 b* _8 M;`* p,V+ L:] 6. 指针数组3 ^1 I+ |( s4 m% w 指针数组无疑就是数组元素为指针,定义形式为: 类型标记 *数组名[数组长度] 如:int *p[4],千万不要写成int (*p)[4],这是指向一维数组指针变量。指针数组多用于存储若干个字符串首地址,注意一点,在定义指针数组时初始化,如下: static char *name[]={"Li jing","Wang mi","Xu shang"}; 不要觉得数组中存储是字符串,它存储是字符串首地址,这一点一定要注意。!X G5 I/ E;g- h3 A2 N 7. 指向指针指针 阐明白一点,将一种指针再用一种变量来存储,那么这个变量就是指向指针指针。定义如:char * *p;:t# S8 p0 ?9 c' }2 i!q- |+ ` 8. 指针数组作main()函数参数- Y& ?!Z' f$ j8 z9 \ 函数形式为 main( int argc,char *argv[] ){}) l' X0 i" _+ ~5 L7 q J main函数参数是从命令行得到,argc指命令行参数个数,注意命令名也算一种参数,命令行参数都是字符串,她们首地址构成一种指针数组argv。Main函数形参用argc和argv只是一种习惯,也可以定义成别名字。 9. 指针小结$ K;L- t0 _( ]& G!J 1)关于指针数据类型3 H* x- J!V3 a) t* Y% ] 定  义 含   义 Int I;定义一种整型变量I Int *p;P为指向整型数据指针变量 Int a[n];定义整型数组a,它有n个元素 Int *p[n];定义指针数组p,它有n个指向整型指针元素 ) K5 W/ l;f4 X$ h# V Int (*p)[n];P为指向具有n个元素一维数组指针变量 Int f();F为返回整型值函数 6 l6 M/ p+ L2 v0 }' c% k Int *p();P为返回值为指针函数,该指针指向整型数据 Int (*p)();P为指向函数指针,该函数返回一种整型值 Int **p;定义一种指向指针指针变量 . F# d x) A) n7 `5 a ' }$ [!k# Y2 }- d% ^;}+ D ( Z C) d!~* g$ h!Y& z5 w 2)ANSI新增了一种void *指针类型,即定义一种指针变量,但不指向任何数据类型,等用届时候再强制转换类型。如: ' |2 n2 y1 q:Q:@!x" j% l5 V char *p1;+ L/ r!_- j8 V,i- d void *p2; p1 = (char *)p2;( Y) |% Y& o1 L# n 也可以将一种函数定义成void *型,如: void *fun( ch1,ch2 )- m0 G5 _,b- ` 表达函数fun返回一种地址,它指向空类型,如果需要用到此地址,也要对其强制转换。如(假设p1为char型):+ j,n3 \$ m/ M" q2 U% p!t$ { p1=(char *)fun( c1,c2 ); 指针应当说是c语言中比较重要概念,也是c语言精华,它有诸多长处,但用不好也会带来严重性错误,这就需要咱们多用,多练,慢慢积累经验。 ( v6 V9 m( B:F5 J# A r# ? & m- L0 j!?1 f6 y4 d;n$ Y 第十章 构造体与共用体 1. 定义 构造体定义普通形式:3 B) O0 ?1 W7 F5 ^3 c4 J O struct 构造体名{$ b# u+ Y( z3 R4 R" b) ? 成员列表 }; 定义一种构造体变量可以这样定义:struct 构造体名 构造体变量名;4 e' Y* U9 f* X- M 2. 构造体变量引用 在引用构造体变量时应注意如下规则: 1)不能将构造体变量作为一种整体输入输出,只能对变量当中各个成员输入输出。新原则C容许将一种构造体变量直接赋值给另一种具备相似构造构造体变量。 3. 构造体变量初始化 如: struct student s" X3 Q4 b$ y% y$ L" v {long int num; char name[20]; char sex;/ F8 v4 Z1 P$ D+ L;Q9 e char addr[20]; }a={89031,"Li Lin",'M',"123 Beijing Road" }; 4. 构造体数组 struct student stu[4]; }# m- W$ E- t0 O 定义了一种数组stu,其元素为struct student类型,数组有4个元素。注意数组各元素在内存中是持续存储。 在定义构造体数组时,数组元素个数可以不指定。编译时,系统会依照给出初值构造体常量个数来拟定数组元素个数。9 l4 N3 S) i1 ]4 c;e!j* a2 v3 ?* T 5. 指向构造体变量指针 由于构造体变量在内存中是持续存储各成员,因而咱们可以将构造体变量在内存中起始地址存储到一种变量中,那么这个变量就是指向构造体变量指针。1 D2 e9 r0 b* p& i3 \1 S 注意将构造体变量首地址赋给指针变量形式:5 \# x,N3 d( Y+ m struct student stu_1; struct student *p; p=&stu_1;//要加取地址符 而指向函数和指向字符串指针不用;_& v* R" E1 U0 A6 Q+ | s0 c 在对引用构造体变量中成员时,有三种方式: 以上面构造体为例:设p为指向此构造体变量指针,即p=&a;;i( u# t:D,b6 J0 \6 _2 L;d,a;e 1) a.num9 e/ y. H
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服