作业11总结
1.指针、数组和地址间的关系
·数组的基地址是在内存中存储数组的起始位置,它是数组中第一个元素(下标为0)的地址,因此数组名本身是一个地址即指针值。
·指针是以地址作为值的变量,而数组名的值是一个特殊的固定地址,可以把它看作是常量指针。
P=a; 等价于 P=&a[0];
p=a+1; 等价于 p=&a[1];
注:P=a+1是合法的,但a=a+1就是非法的。
·数组名可以使用指针形式,而指针变量也可以转换为数组形式。
·如果变量p是指向某个指定类型变量的指针,那么表达式p+1代表访问该类型的下一个变量的内存地址。(像p+i、p++、p+=i这样的表达式都是有意义的)
·两个相同类型的指针相减,表示它们之间相隔的数组元素数目。
注:在C语言中,指针的算术运算只包括两个相同类型的指针相减以及指针加上或减去一个整数,其他的操作如指针相加、相乘和相除,或指针加上和减去一个浮点数都是非法的。
·两个相同类型指针还可以使用关系运算符比较大小。
2.数组名作为函数的参数
使用数组b作为实参调用sum函数的方法
调用 |
被计算和被返回的内容 |
Sum(b,100) |
b[0]+b[1]+...+b[99] |
Sum(b,88) |
b[0]+b[1]+...+b[87] |
Sum(&b[7],k-7) |
b[7]+b[8]+...+b[k-1] |
Sum(b+7,2*k) |
b[7]+b[8]+...+b[2*k+6]
|
3.字符串和字符指针
·如果定义一个字符指针接收字符串常量的值,该指针就指向字符串的首字符。这样,字符数组和字符指针都可以用来处理字符串。例如:
Char sa []=”array”;
Char *sp=”point”;
Printf(“%s”,sa);
Printf(“%s”,sp);
Printf(“%s\n”,”string”);
输出:
Array point string
调用printf(函数),以%s的格式输出字符串时,作为输出参数,数组名sa、指针sp和字符串“string”的值都是地址,从该地址所指定的单元开始连续输出其中的内容(字符),直至遇到‘\0’为止。
·定义字符指针后,如果没有对它赋值,指针的值是不确定的,不能明确它指向的内存单元。
·为了尽量避免引用未赋值的指针所造成的危害,在定义指针时,可先将它的初值置为空。 如:char *s=NULL。
4.常用的字符串处理函数
·字符串的输入和输出:函数scanf()和gets()可用来输入字符串,而printf()和puts()输出字符串。它们在系统文件stdio.h中定义。
①scanf:格式控制字符串中使用格式控制说明%s,输入参数必须是字符型组名。该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符‘\0’送入数组中。
例如:scanf(“%s”,s);
②printf:格式控制字符串中相应的格式控制说明用%s,输出参数可以是字符数组名或字符串常量。输出‘\0’结束。例如:printf(“%s”,s);
③字符串输入函数gets(s):参数s是字符数组名。函数从输入得到一个字符串,遇回车输入结束,自动将输入的数据和‘\0’送入数组中。采用函数gets()输入的字符串允许带空格。实际上函数gets()有返回值,如果输入成功则返回值是字符串第一个字符的地址,如果输入失败则返回NULL。但一般情况下使用gets()主要是为了输入字符串,而不关心它的返回值。
④字符串输出函数puts(s):参数s可以是字符数组名或字符串常量。输出时遇‘\0’自动将其转换为‘\n’,即输出字符串后换行。同样函数puts()也有返回值,如果成功执行了输出字符串的操作,则返回换行符号‘\n’,否则返回EOF。