指针存在的理由确实有些怪异。
但就指针这个知识点而言,真的没有多大存在的必要性,因为它主要起到“间接引用”的作用,可以不必出现指针,直接引用相关的变量或数组元素就足够了。(这里我要声明,对于初学者而言,什么直接对内存访问啊、什么可以直接访问硬件接口啊等的问题都是没有什么意义的。)
但是,当楼主学习了函数之后,你就会发现,如果没有指针的存在,那么就无法实现“通过一个子函数更改其父函数中两个或两个以上的变量的值”的功能了。(这里我还要声明,对于学习C语言而非C++的初学者来说,“引用传递”的概念也是没有什么意义的。毕竟学习是有阶段性的。)
举例说明:
编写一个能交换两个变量的值的函数(任意指定的两个变量):
void Exchange(int, int);
void Exchange(int a, int b)
{
int c;
c = a;
a = b;
b = c;
}
int main(void)
{
int m, n;
scanf("%d %d", &m, &n);
Exchange(m, n);
printf("%d %d\n", m, n);
}
相信楼主对这个例子应该很了解了,结果是,Exchange()函数没有实现交换两个变量的值的功能。
原因有3个:
1、C语言的函数具有“高度的独立性”:指C语言的函数所定义的局部变量(包括形参变量)只能在本函数体内被引用,不能被其他函数引用;而函数自己也不能调用其他函数的局部变量;
所以,不能通过直接修改“父函数”局部变量的方法实现前面所提到的功能。语法都无法通过。
2、C语言函数的返回值最多只有一个,所以不能通过同时返回两个或两个以上的值的方式实现前面所提到的功能。
3、C语言函数的实参与形参之间,只有“值传递”一种数据传递方法。这也就是说,形参变量(注意我这里将所有的形参全部看成是变量,根本没有数组等形式)的值,是实参表达式的值的“复制”版,因此,以后无论对形参变量进行什么样的更改,都不会更改实参表达式中相关变量的值。
由于存在上述严厉的现实,因此,要实现前面所说的功能,就只能依靠指针,进行“间接”更改了。
而这正是指针赖以存在的基本理由!