资源描述:
《C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、2021/7/221上一节我们学到了作用域和生存期内存分配static关键字的两种作用静态局部变量静态全局变量定义和声明的区别定义:只一次、确定类型并分配内存,创建新对象声明:可多次、不分配内存,不创建新对象,只是描述其他地方创建的对象2021/7/222第8章善于利用指针8.1指针是什么8.2指针变量8.3通过指针引用数组8.4通过指针引用字符串8.5指向函数的指针8.6返回指针值的函数8.7指针数组和多重指针8.8动态内存分配与指向它的指针变量8.9有关指针的小结2021/7/223计算机内的存储部件,活动中的指令和多数数据都保存在内存内;速度快,但是掉电即失;内存中的每个字节都有唯
2、一的一个地址;地址是一个无符号整数(通常用16进制数),其长度与机器字长相同内存(RandomAccessMemory)地址(Address)2021/7/224指针的故事指针造就了C/C++的高效和强大很多不可能的任务由指针完成输出自身的源代码intmain(){char*a="intmain(){char*a=%c%s%c;printf(a,34,a,34);return0;}";printf(a,34,a,34);return0;}2021/7/225指针的故事"该程序执行了非法操作,即将关闭"这种错误几乎全是由指针和数组导致的黑客攻击服务器利用的bug绝大部分都是指针和数组造成
3、的尽量避免使用指针2021/7/226关于指针的原则学习原则掌握其实通常的应用很简单就是一个变量复杂的应用也不建议使用使用原则永远要清楚每个指针指向了哪里区分"指针"和"指针变量"我们通常说,某地址"指向"某变量单元。因此在C语言中,将地址形象化地称为"指针"(pointer)。一个变量的地址称为该变量的“指针”。例如,地址0x0012ff40是变量i的指针(地址)。专门用来存放指针(即地址)的变量,称为"指针变量"。指针变量的值是指针(地址)。区分"指针"和"指针变量",可以类比"整型数据"和"整型变量"。0x0012ff440x0012ff40inti=0;int*pi=&i;pii
4、2021/7/228指针(Pointer)的定义int*p;定义了一个指向int的指针变量p,简称指针pdouble*pd;char*pc;混淆的原因2021/7/229int*p还是int*pint*p;int*p;哪个好?int*b,c,d;b、c、d各是什么类型?b:int*c:intd:intint*b,*c,*d;//选择这个2021/7/2210指针的赋值请牢记:指针变量中只能存放地址(指针)。下面的赋值是不合法的:int*pScore=100;地址为100的内存是OS内核区,不能存取int*指针必须指向int型数据inti;int*p;p=&i;doubled;doubl
5、e*p=&d;inti=0;int*pi=&i;2021/7/2211指针变量类型指向不同数据类型的指针,分别为不同的数据类型int*、float*、char*、int**、int***……void*类型的指针可以指向任意类型的变量指针变量的大小int*p;sizeof(int*)sizeof(p)double*pd;sizeof(double*)?sizeof(pd)?char*pc;sizeof(char*)sizeof(pc)所有类型的指针变量都占4个字节2021/7/22122021/7/2213&与*运算符&:取地址运算符inti,*p;p=&i;int*p,a[10];p
6、=a;int*p,a[10];p=&a[0];double*p,a[10];p=&a[5];*:指针运算符,取得指针指向的变量值inti,*p;p=&i;*p=0;printf(“%d”,*p);int*p,a[10];p=a;*p=0;int*p,a[10];p=&a[5];*p=5;printf(“%d”,*p);inti=0;printf(“%d”,*&i);2021/7/2214数组名到底是什么inta[10];数组名a就是"指向数组首元素的常量指针""常量"意味着不能修改数组名还隐含着数组的属性,即数组的长度和每个元素的类型,编译器是可以获得这些属性的a不同于&
7、a[0],sizeof(a),sizeof(&a[0])?除了数组名被用作运算符sizeof的参数这一情形,在其他所有的情形中数组名都代表指向数组首元素的指针。-----《C陷阱与缺陷》2021/7/2215常见错误1:引用未初始化的指针int*p;...*p=12;程序在执行这个赋值操作的时候,会发生什么情况呢?2021/7/2216NULL指针NULL指针,即空指针,表示什么都不指向。指针怎么初始化?如果你已经知道指针将被初始化