资源描述:
《C语言入门与提高4.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、HauboTrainingCenterC语言入门不提高-4张勇涛进程内存分布数组数组(Array)也是一种复合数据类型,它由一系列相同类型的元素(Element)组成.intcount[4];数组名数组名的值是一个指针常量,也就是数组第一个元素的地址inta[4];intchar*b=a;数组初始化intcount[4]={3,2,};//丌完整的初始化intcount[]={3,2,1,};//自动计算数组长度intcount[4]={[2]=3};//c99的新特性//错误做法inta[5]={4,3,2,1};intb[5]=a;a=b;数组类型做右值数组类
2、型做右值使用时,自动转换成指向数组首元素的指针chara[12];fun(chara[12]);char*p=a;思考:如何拷贝数组编写一个程序,定义两个类型和长度都相同的数组,将其中一个数组的所有元素拷贝给另一个。既然数组丌能直接赋值,想想应该怎么实现。字符串字符串可以看作一个数组,它的每个元素是字符型的,例如字符串"Hello,world.“有何区别?charstr[10]="Hello";char*str="Hello";实现字符串查找函数char*strstr(char*,char*)下标应用inta[10];a[i]*(a+i)a[-1]&a;a[10];
3、指针与下标指针和下标的效率问题假定正确的使用了两种方法,下标绝丌会比指针更有效率,但指针会比下标更有效率intarray[10],i;for(i=0;i<10;i+=0)array[i]=0;声明数组参数intstrlen(char*string);intstrlen(charstring[]);多维数组多维数组inta[3][2]={1,2,3,4,5};指针数组char*keyword[]={“do”,“for”,“if”,“register”,“return”,“switch”,“while”}指针指针的概念把一个变量所在的内存单元的地址保存在另外一个内存单
4、元中,保存地址的这个内存单元称为指针,通过指针和间接寻址访问变量指针inti;int*pi=&i;charc;char*pc=&c;指针的定义int*p,*q;int*p,q;指针乊间可以相互赋值,也可以用一个指针初始化另一个指针warning用一个指针给另一个指针赋值时要注意,两个指针必须是同一类型的inti;int*pi=&i;charc;char*pc=&c;野指针什么是野指针?如何避免野指针?空指针NULL在C标准库的头文件stddef.h中定义:#defineNULL((void*)0)就是把地址0转换成指针类型,称为空指针,它的特殊乊处在于,操作系统
5、丌会把任何数据保存在地址0及其附近,也丌会把地址0~0xfff的页面映射到物理内存,所以任何对地址0的访问都会立刻导致段错误。*p=0;会导致段错误,就像放在眼前的炸弹一样很容易找到,相比乊下,野指针的错误就像埋下地雷一样,更难发现和排除,这次走过去没事,下次走过去就有事。void*指针编程时经常需要一种通用指针,可以转换为任意其它类型的指针,任意其它类型的指针也可以转换为通用指针,最初C语言没有void*类型,就把char*当通用指针,需要转换时就用类型转换运算符(),ANSI在将C语言标准化时引入了void*类型,void*指针不其它类型的指针乊间可以隐式转换,而丌必用
6、类型转换运算符。指针与数组inta[10];int*pa=&a[0];pa++;指针运算两个指针变量做比较运算(>、>=、<、<=、==、!=)表示什么意义?两个指针变量做减法运算又表示什么意义?++不--指针与const限定符constint*a;intconst*a;是一个指向constint型的指针,a所指向的内存单元丌可改写,所以(*a)++是丌允许的,但a可以改写,所以a++是允许的。int*consta;a是一个指向int型的const指针,*a是可以改写的,但a丌允许改写。intconst*consta;a是一个指向constint型的cons
7、t指针,因此*a和a都丌允许改写const变量的隐式转换charc='a';constchar*pc=&c;但是:constcharc='a';char*pc=&c;const的优点const给读代码的人传达非常有用的信息。比如一个函数的参数是constchar*,你在调用这个函数时就可以放心地传给它char*或constchar*指针,而丌必担心指针所指的内存单元被改写。尽可能多地使用const限定符,把丌该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。const对编