C语言要点总结

上传人:mg****2 文档编号:122067436 上传时间:2020-02-29 格式:DOC 页数:37 大小:1.82MB
返回 下载 相关 举报
C语言要点总结_第1页
第1页 / 共37页
C语言要点总结_第2页
第2页 / 共37页
C语言要点总结_第3页
第3页 / 共37页
C语言要点总结_第4页
第4页 / 共37页
C语言要点总结_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《C语言要点总结》由会员分享,可在线阅读,更多相关《C语言要点总结(37页珍藏版)》请在金锄头文库上搜索。

1、.C和指针C专家编程C陷阱与缺陷C语言编程要点总 结说明:总结的知识点主要源于上面的4本书。-wuliming -2007-04-25wuliming_指针和数组相关概念*字符与字符串的区别指针与数组1指针与数组2指针和数组的相同与不同用malloc为字符串分配存储空间时的注意事项字符串常量用字符串常量初始化指针和数组二维数组下标操作的相关概念指向一维、二维数组的指针array_name和&array_name的异同数组作为函数的参数时,不能通过sizeof运算符得到该数组的大小用strlen()求字符串的长度char * 和 const char *的兼容性问题空指针相关的问题NULL和NU

2、L的区别未初始化的指针和NULL指针的区别理解函数的声明函数参数的传值调用函数指针作为函数参数的多维数组强制类型转换相关概念malloc()、calloc()、realloc()字符与字符串的区别(c缺陷与陷阱1.5节)#include int main() char ch = abcdefghijklmnopqrstuvwxyz; char str = abcdefghijklmnopqrstuvwxyz; printf(-%c-n%sn,ch, str );return 0;编译该程序可以通过,但是会产生警告;输出结过为:-z-Abcdefghijklmnopqrstuvwxyz / 在D

3、ev-C+ 4.9.9.2编译环境中可以通过,但是在VC.0中通不过指针与数组1(c缺陷与陷阱3.1节)c语言中的数组值得注意的地方有以下两点:1、c语言中只有一维数组,而且数组的大小必须在编译期间就作为一个常数确定下来(C99标准允许变长数组,GCC编译器中实现了变长数组)。然而,c语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要仿真出一个多维数组就不是一件难事。2、对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标

4、运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。现在考虑下面的例子:int i;int *p;int calendar1231;上面声明的calendar是一个数组,该数组拥有12个数组类型的元素,其中的每个元素都是一个拥有31个整型元素的数组。因此,sizeof(calendar)的值是:3112sizeof(int)。考虑一下,calendar4的含义是什么?因为calender是一个有着12个数组类型元素的数组,它的每个数组类型元素又是一个有着31个整型元素的数组,所以calendar4是calendar数组的第5个元素,是calendar数组中12个有着

5、31个整型元素的数组之一。因此,calendar4的行为也表现为一个有着31个整型元素的数组的行为。例如,sizeof(calendar4)的结果是:31sizeof(int)。又如,p = calendar4;这个语句使指针p指向了数组calendar4中下标为0的元素。因为calendar4是一个数组,我们可以通过下标的形式来指定这个数组中的元素:i = calendar47,这个语句也可以写成下面这样而表达的意思保持不变:i = *( calendar4 + 7 ),还可以进一步写成:i = *( *( calendar + 4 ) + 7 )。下面我们再看:p = calendar;

6、这个语句是非法的,因为calendar是一个二维数组,即“数组的数组”,在此处的上下文中使用calendar名称会将其转换为一个指向数组的指针。而p是一个指向整型变量的指针,两个指针的类型不一样,所以是非法的。显然,我们需要一种声明指向数组的指针的方法。int calendar1231;int (*monthp)31;monthp = calendar;int (*monthp)31 语句声明的 *monthp 是一个拥有31个整型元素的数组,因此,monthp就是一个指向这样的数组的指针。monthp指向数组calendar的第一个元素。指针与数组2(c和指针.P141.)1、数组的名的值是

7、一个指针常量,不能试图将一个地址赋值给数组名;2、当数组名作为sizeof操作符的操作数时,sizeof(arrayname)返回的是整个数组的长度,而不是指向数组的指针的长度;3、当数组名作为单目操作符&的操作数,取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。4、指针和数组并不总是相等的。为了说明这个概念,请考虑下面这两个声明:int a5;int *b;a和b能够互换吗?它们都具有指针值,它们都可以进行间接访问和下标操作。但是,它们还是有很大的区别的:声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值是一个常量

8、,指向这段空间的起始位置。声明一个指针变量时,编译器只为指针本身保留内存空间,它并不为任何整型值分配内存空间。而且,指针变量并未被初始化为指向任何现有的内存空间,如果它是一个自动变量,它甚至根本不会被初始化。把这两个声明用图的方法表示,可以发现它们之间存在显著的不同: a b? 因此,上述声明后,表达式*a是完全合法的,但表达式*b却是非法的。*b将访问内存中某个不确定的位置,或者导致程序终止。另一方面,表达式b+可以通过编译,但是a+却不能,因为a的值是一个常量。#includeint main() /注意sizeof(num)的长度应该为10*4=40 int num = 0,1,2,3,

9、4,5,6,7,8,9;printf( sizeof(num) = %dn, sizeof(num) );/注意sizeof(str)的长度应该为11,包括字符串后面的0 char str = 0123456789;printf( sizeof(str) = %dn, sizeof(str) );/注意sizeof(str1)的长度应该为10,不包括字符串后面的0,但是,最好将字符串的最后一个字符设定为空char str1 = 0,1,2,3,4,5,6,7,8,9;printf( sizeof(str1) = %dn, sizeof(str1) );/&num的类型为int (*)10,表示

10、的是一个指向长度为10的整形数组的指针int (*ptoint)10 = #printf( sizeof(ptoint) = %d, (*ptoint)9 = %dn, sizeof(ptoint), (*ptoint)9 );/&str的类型为char (*)11,表示的是一个指向长度为11的字符数组的指针,注意str数组的长度是11,而不是10char (*ptostr)11 = &str;printf( sizeof(ptostr) = %d, (*ptostr)9 = %cn, sizeof(ptostr), (*ptostr)9 );/由于p指向的是数组num5,所以对下标取

11、负值后,不会超出数组的正常取值范围/该例子也说明了为什么下标检查在c语言中是一项困难的任务:下标引用可以作用于任意的指针,而不仅仅是数组名/作用于指针的下标引用的有效性即依赖于该指针当时恰好指向什么内容,也依赖于下标的值int *p = num + 5;printf( p-1 = %d, p0 = %d, p1 = %d n, p-1,p0,p1 );/下面的表达式中,num5和5num的值是一样的,把它们转换成对等的间接访问表达式,它们都等同于*(num + 2)/5num这个古怪的表达式之所以可行,缘于C实现下标的方法。对编译器来说,这两种形式并无差别/但是,决不应该编写形如5num的表达

12、式,因为它会大大的影响程序的可读性printf( num5 = %d, 5num = %d n, num5, 5num ); getchar();return 0;输出结果为:指针和数组的相同与不同(c专家编程.P199.)在实际应用中,数组和指针可以互换的情形要比两者不可互换的情形更为常见。让我们分别考虑“声明”和“使用”这两种情况。声明本身还可以进一步分为3种情况:外部数组的声明;数组的定义(定义是声明的一种特殊情况,它分配内存空间,并可能提供一个初始值);函数参数的声明; extern,如extern char a; 不能改写为指针的形式 声明 定义,如char a10; 不能改写为指针的形式 数组 函数的参数,可以随意选择数组 在表达式中使用 的形式或者指针的形式 如c=ai,可以随意选择数组 形式或者是指针形式也既是:作为函数参数时、在语句或表达式中使用数组时,我们可以采用数组或者指针的任何一种形式,除此之外的其他情况下,指针和数组不要互换。下面就数组和指针相同的情况做详细的说明:规则1、表达式中的数组名被编译器当作一个指向该数组第一个元素的指针。假如我们声明:int a10; int *p = a;就可以通过一下任何一种方式来访问ai:pi *( p + i ) *( a + i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号