5.16 自测练习答案
5.1
a)地址
b)0、NULL 或地址
c)0
5.2
a)不正确,地址运算符只能用于变量,不能用于常量、表达式或用存储类 register
声明的变量。
b)不正确,void
的指针无法复引用,因为无法知道要用多少内存字节复引用。
c)不正确,void
类型指针可以赋给其他类型的指针。 void
类型指针要通过显式地强制类型转换才可以赋给其他类型的指针。
5.3
a)float numbers[ SIZE ] = {0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8,9.9};
b) float *nPtr;
c) cout << setiosflags ( ios:: fixed | ios:: showpoint
<< setprecision ( 1 );
for ( i = 0; i < SIZE; i++ )
cout << numbers[ i ] << ' ';
d) nPtr = numbers;
nPtr = &numbers[ 0 ] ;
e) cout << setiosflags ( ios:: fixed | ios:: showpoint
<< setprecision( 1 );
for ( i = 0; i < SIZE; i++ )
cout << *( nPtr + i ) << ' ';
f) cout << setiosflags( ios::fixed | ios::showpoint
<< setprecision( 1 );
for ( i = 0; i < SIZE; i++ )
cout << *( numbers ) << ' ';
g) cout << setiosflags ( ios: :fixed | ios: :showpoint
<< setprecision( 1 );
for ( i = 0; i < SIZE; i++ )
cout << * ( numbers + i ) << ' ';
h) numbers[ 4 ]
* ( numbers + 4 )
nPtr[ 4 ]
* ( nPtr + 4 )
i) 地址为 1002500 + 8 * 4 = 1002532 值为8.8。
J) numbers[ 5 ]的地址为 1002500 + 5 * 4 = 1002520。
nPtr -= 4的地址为1002500 - 4 * 4 = 1002504
5.4
a) float *fPtr;
b) fPtr = &number1;
c) cout << "The value of * fPtr is "<< *fPtr << endl;
d) number2 = *fPtr;
e) cout << "The value of number2 is " << number2 << endl;
f) cout << "The address of number1 is "<< number1 << endl;
g) cout << "The address stored in fPtr is "<< fPtr << endl;
h) strcpy(s1,s2);
i) cout << "strcmp(s1,s2) =" << strcmp(s1,s2 ) << endl;
j) strncat( s1,s2,10 );
k) cout << "strlen(s1) = "<< strlen( s1 ) << endl;
l) ptr = strtok( s2, "," );
5.5 a) void exchange( float *, float *y )
b) void exchange( float *x, float * );
c) int evaluate( int x, int (*poly) ( int ) )
d) int evaluate( int,int (*)( int ) );
e) char vowe1[ ] = "AEIOU";
char vowe1[ ] = ( 'A', 'E', 'I','O','U','\0' };
5.6
a)不正确: zPtr
没有初始化。
纠正:用 zPtr = z
初始化 zPtr
。
b)不正确:指针没有复引用。
纠正:将该语句变成 number = *zPtr
c)不正确: zPtr[2]
不是指针,不能复引用。
纠正:将 zPtr[2]
变为 *zPtr[2]
d)不正确:指针下标引用数组界限之外的数组元素。
纠正:将for结构中的关系运算符变为 <
以避免指针下标引用数组界限之外的数组元素。
e)不正确:void指针无法复引用。
纠正:要复引用指针,首先要将其转换为整型指针。将上述语句变为:
number = (int*)sPtr;
f)不正确:指针算法修改数组名。
纠正:用指针变量而不用数组名完成指针算法,或在数组名后面加上下标引用特定元素。
g)不正确:函数 strncpy
没有将 null
终止符写入数组s,因为第三个参数等于字符串 hello
的长度。
纠正:将 strncpy
的第三个参数变为6或对 s[5]
赋值 '\0'
,确保在字符串后加上终止 null
符。
h)不正确:字符数组s太小,不能存放 null
终止符。
纠正:声明更多元素的数组。
i)不正确:函数 strcmp
在字符串相等时返回0,因此if结构中的条件为假,不执行输出
语句。
纠正:在 if 结构条件中将 strcmp 的结果与0比较。
5.7
a)jill
b)jack and jill
c)8
d)13