下面我们可以通过一道例题来得出利用指针传进数组的三种方式;其中,第三种是较为常用的方法,深度钻研这三种方式,可以对指针有一个较好的了解。我们接下来就来探讨。
题目:编程读入一行字符串(最多80个字符),将其中的英文字母按大小写变换后输出。
输入格式:
-
There ARE Two Ways iN solvinG tHis ProblEm.
输出格式:
tHERE are tWO wAYS In SOLVINg ThIS pROBLeM.
代码如下:
第一种:
#include<stdio.h>
void change(char *x)
{
int i;
gets(x);
for(i=0;x[i]!='\0';i++)
{
if(x[i]>='A'&&x[i]<='Z') x[i]+=32;
else if(x[i]>='a'&&x[i]<='z') x[i]-=32;
}
}
int main()
{
char s[200];
change(s);
printf("%s",s);
return 0;
}
我们直接看指针指向的部分,即我们自定义的函数里,我们在定义的时候就已经把指针定义好指向这个形参数组里了,在处理过程中,我们可以直接使用数组的下标方式(即x[ i ])就可以直接计算了。
第二种:
#include <stdio.h>
void change(char *x)
{
int i;
gets(x);
for (i = 0; * (x + i) != '\0'; i++)
{
if (*(x + i) >= 'A' && *(x + i) <= 'Z')
*(x + i) += 32;
else if (*(x + i) >= 'a' && *(x + i) <= 'z')
*(x + i) -= 32;
}
}
int main()
{
char s[200];
change(s);
printf("%s", s);
return 0;
}
这里也是直接看向指针指向的部分,在处理过程中我们把第一种x[ i ]的表达式改成了*(x+i),这里我们细讲一下*(x+i)。我们先区别一下*x+i和*(x+i)的区别,前者的意思是,*x的值加上i这个数值,而*x我们已经指向s这个数组了(x与s是等量关系),即把数组s的首地址放到x处(*x = s),即*x=x[0];后者的意思就是x+i,x是首地址的情况下地址后移 i 位,相信读者也很容易看出这个括号的作用*(x+i)了,以此便于我们依次访问数组各数。(这里补充一下,地址在引用的时候,*x表示一个值,而单单x则表示一个地址)
第三种:
#include <stdio.h>
void change(char *x)
{
int i;
gets(x);
while (*x != '\0')
{
if (*x >= 'A' && *x <= 'Z')
*x += 32;
else if (*x >= 'a' && *x <= 'z')
*x -= 32;
x++;
}
}
int main()
{
char s[200];
change(s);
printf("%s", s);
return 0;
}
这里我们运用了while循环,但输出结束指令时就跳出循环。正如上面所说,x已经表示一个地址了,在我们判断好一个字符时,我们只需令x的地址移到下一个位置就行了,这里的x++为什么不是*x++呢,第二种补充的时候说到了单单x指的就是一个地址,而加上*则表示一个值了,*x++就表示这个*x值的自增。
综上,仔细阅读和思考后会对指针有个深刻的认识,本人才疏学浅,有什么不足的地方还望指出!