网站大量收购闲置独家精品文档,联系QQ:2885784924

C课件8再谈指针.PPT

  1. 1、本文档共79页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言中级培训 八、再谈指针 指针的初始化 一般形式: [存储类型] 数据类型 *指针变量名=初始地址值; 指针的赋值 指针与变量的区别: char str[] = “hello”; char *p = str; int n = 10; 计算sizeof的值(32位计算机): sizeof (str) = ? sizeof (p) = ? sizeof (n) = ? void Fun(char str[100]) { sizeof (str) = ? ( 答案:4 ) } 指针变量与零值比较: 指针变量的零值是“空”(记为NULL)。尽管NULL的值与0相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if语句如下: if (p == NULL) // p与NULL显式比较,强调p是指针 变量 或 if (p != NULL) 不要写成 if (p == 0) // 容易让人误解p是整型变量 if (p != 0) 或: if (p) // 容易让人误解p是布尔变量 if (!p) 有时候我们可能会看到 if (NULL == p) 这是写错了吗? 不!是有意把p和NULL的位置颠倒。 因为当把if (p == NULL) 误写成 if (p = NULL)时,编译器会认为 if (p = NULL) 是合法的,它将执行一条赋值语句,然后将表达式的值作为if的判断依据。显然那不是我们的本意。但若把if ( NULL == p) 写成if ( NULL = p),编译器是会指出语法错误,因为NULL不能被赋值。这样可以避免不易察觉的错误的发生,让编译器替我们排除更多的错误。 指针的漏洞 关于“野指针” “野指针”产生的3种原因: 指针变量没有被初始化。指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气; 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针; 指针操作超越了变量的作用范围; 关于“野指针” 避免“野指针”产生的对策: 使用指针前一定要保证它指向了有效的内存空间(或者申请,或者让指针指向一块合法的空间) 用malloc或new申请内存之后,应该立即检查指针值是否为NULL。 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。 动态内存的申请与释放必须配对,防止内存泄漏。 用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 指针的类型转换 大存储类型的指针向小存储类型的指针转换,会带来错误风险 如 int a =0 int *pa = a; char *pc = (char*)pa; (*pa)的数值为0 (*pc)的数值为0x12; 小存储类型的指针向大存储类型的指针转换,会带来极大的错误风险 如 char b = 0x12; char *pb = b; int *pd = (int*)pb; *pb的数值为0x12,*pd 的数值未知; 指针与数组 三种方法的统一: 三种方法的本质都是:间址(变址) 无论是下标法(a[ i ])还是计算法(*(a+i))还是指针法(* (p +i) ),尽管表现形式不同,可本质都是: *(首址+ 偏移量) 与指针相关的运算符 因a是二维数组名,代表二维数组的首地址,不能用*a来获得a[0][0]的值,*a只相当于a[0]; 正确的访问形式是: int i,a[ 3 ] [ 4 ] = { { 1,2 },{ 3,4,5 },{ 6,7,8,9 } }; int (*p)[4] = a; i=a[0][1]; 下标法 或 i=*(*(a+0)+1); 计算法 或 i=*(*(p+0)+1); 指针法 或 i=*(a[0]+1); 下标计算法 或 i=*(a+0)[1]; 计算下标法 或 i=*(p+0)[1]; 指针下标法 或 i=*(p[0]+1); 下标计算法 虽然指针和数组都表示地址,有时可以混用、相互替换。但它们是有区别的。 指针指向的是内存块,可以改变;而数组名是某块固定内存的地址,不能改变。 如:char a[10], *p

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档