下面我们可以通过一道例题来得出利用指针传进数组的三种方式;其中,第三种是较为常用的方法,深度钻研这三种方式,可以对指针有一个较好的了解。我们接下来就来探讨。

题目:编程读入一行字符串(最多80个字符),将其中的英文字母按大小写变换后输出。

输入格式:

  1. There ARE Two Ways iN solvinG tHis ProblEm.                                                                    

输出格式:

  1. 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值的自增。

综上,仔细阅读和思考后会对指针有个深刻的认识,本人才疏学浅,有什么不足的地方还望指出!