前面通过对指针和数组的介绍,或多或少各位看官会认为其有所关系。但事实上,两者并无关系,以下我将从一个角度去表示我的看法。
1.为什么C语言中要存在两者
在解释之前,先看一段代码(然后我将分别以指针和数组的形式访问):
char* str="hello bit";//str指针变量在栈上保存,而abcdef在字符常量区,不可被修改
char buffer[]="hello world";//整个数组都在栈上保存,这部分可以被修改
(对于用指针指向的字符串内容,其内容放在字符串常量区中,虽然指针在栈上开辟,但当退出main函数后,指针所用的栈空间被释放后,其字符串因为在字符串常量区,所以不可被用户修改。但对于数组存储的字符串内容,是全部存储到栈上开辟的空间中,这块空间属于用户空间,可被修改)只是解释下,并无不影响主要内容。
<1>以指针的形式访问指针和以下标的形式访问指针
int len = strlen(str);
for (int i = 0; i < len; i++)
{
printf(" % c\t", *(str + i));
printf("%c\n", str[i]);
}
printf("\n");
<2>以数组的形式访问
int len = strlen(arr);
for (int i = 0; i < len; i++)
{
printf(" % c\t", *(arr + i));
printf("%c\n", arr[i]);
}
printf("\n");
system("pause");
结果我们会发现即使访问的方式不同,但打印出来的内容"abcdef"却相同,所以通过这个测试,我们可以得到指针和数组在在指向或者表示一块空间时,访问方式是相通的。但是C语言为什么要存在这两者呢?通过前面数组的介绍,我们知道数组传参是要发生降维成为指针的现象(数组arr在main函数中为数组,但在传入函数后,其arr就变成数组首元素的指针变量)。我么假设只以数组只能【】访问,指针只能通过*解引用访问,看一段代码
void InitArr(int arr[], int n)
{
for (int i = 0; i < n; i++)
{
*(arr + i) = i;//以指针的形式去访问
}
}
int main()
{
int arr[10];
int n = 9;
InitArr(arr, n);
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);//以数组的形式去访问
}
system("pause");
return 0;
}
其实并无太大问题,但是我们难免会发现在C中(面向过程)对于程序猿是极不友好的,因为这样的编写会需要程序员不断在指针和数组之间反复切换思维,结果可能会增大程序写错的概率。打通指针和数组的山洞,就好像将不同的语法在使用上越统一,那么就越节省人力。
结论:指针和数组在指向或者表示一块空间的时候,访问方式时可以互通的,具有相似性。到并不代表两者是同一东西。
以上就是为什么C语言为什么要存在这两者,至于指针和数组的区别,我就不重复发明轮子了,推上链接http://t.csdn.cn/uVUh4,这位chrry大佬总结的十分明白。还有一个函数指针我会最近尽快补完博客,并在指针一文中完善。若是文中有什么问题,希望诸位看官能不惜赐教,谢谢。