正在加载图片...
第6单元指针 水 source source +t destin +t tin =0: 分析:函数 mystrcpy()的功能为将一个字符串的内容复制到另一个字符型数组中 去。在复制字符串时要注意,一定要保证目标数组确实可以放得下整个字符串。初学者最易 犯的一个错误是混淆指针与数组的概念,写出如下的语句 char *stringl =This is a sample. char *string2 strcpy(string2, stringl) 这时确实可以将字符串 stringl中的内容复制到从存放于指针 string2中的地址开始的 段内存中去。但问题是指针 string2中存放的究竟是谁的地址?由于没有对 string2赋值,所 以它可能指向任何地方,包括已经分配给其他变量、数组甚至函数的区域。向 stringz复制字 符串会覆盖这些地方原来的内容,造成各种运行错误,包括突然死机;即使幸而指针 string2 指向一片未被使用的存储区,成功地复制了字符串,但由于没有合法的授权,也不能保证其 后程序不再将这片存储区域分配给其他的变量或数组,从而造成刚刚复制的内容又被其他 数据所覆盖。 上面的例子使用了字符类05:1000 型的数组其特点是每个数组0:0F2 整型数组 array 元素的大小正好是一个字节。DS:1003 DS:1004 如果使用其他类型的数组,其 指针的运算规则要不要进行修:100100指针pr:指向数组aray 改呢? DS:1008 指针qtr:指向数组 array之后 假设有指针ptr,qtr以及整s:1009 型数组 array: DS: 100A 整数变量len DS: 100B int *ptr, * qtr int array [3] 图6-5指向整型数组的指针的运算 其关系如图6-5所示。 从图6-5中容易看出,如果 ptr++ 的结果仍是在指针变量pr原来的值上加1,即p的值由1000变为1001,则其作为地址来 说已经没有意义,因为地址为1001的存储单元并不是某个数组元素或变量的第一个存储单第 6 单元 指针 - 117 - { *destin = *source; source ++; destin ++; } *destin = 0; } 分 析: 函数 mystrcpy()的功能为将一个字符串的内容复制到另一个字符型数组中 去。在复制字符串时要注意, 一定要保证目标数组确实可以放得下整个字符串。初学者最易 犯的一个错误是混淆指针与数组的概念, 写出如下的语句: char *string1 = "This is a sample."; char *string2; ... ... strcpy(string2, string1); 这时确实可以将字符串 string1 中的内容复制到从存放于指针 string2 中的地址开始的一 段内存中去。但问题是指针 string2 中存放的究竟是谁的地址? 由于没有对 string2 赋值,所 以它可能指向任何地方, 包括已经分配给其他变量、数组甚至函数的区域。向 string2 复制字 符串会覆盖这些地方原来的内容,造成各种运行错误, 包括突然死机;即使幸而指针 string2 指向一片未被使用的存储区,成功地复制了字符串, 但由于没有合法的授权, 也不能保证其 后程序不再将这片存储区域分配给其他的变量或数组, 从而造成刚刚复制的内容又被其他 数据所覆盖。 上面的例子使用了字符类 型的数组, 其特点是每个数组 元素的大小正好是一个字节。 如果使用其他类型的数组, 其 指针的运算规则要不要进行修 改呢? 假设有指针 ptr, qtr 以及整 型数组 array: int *ptr,*qtr; int array[3]; 其关系如图 6-5 所示。 从图 6-5 中容易看出, 如果 ptr++; 的结果仍是在指针变量 ptr 原来的值上加 1, 即 ptr 的值由 1000 变为 1001,则其作为地址来 说已经没有意义, 因为地址为 1001 的存储单元并不是某个数组元素或变量的第一个存储单 DS:1000 DS:1001 DS:1002 DS:1003 DS:1004 DS:1005 DS:1006 DS:1007 DS:1008 DS:1009 DS:100A DS:100B 指针ptr:指向数组array 1006 指针qtr:指向数组array之后 图6-5 指向整型数组的指针的运算 1 2 1000 0003 整数变量len 整型数组array 3
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有