在本科毕业前,一直以为数组名就是指针,但是最近看了一些技术文章和与一些技术大佬的讨论,我开始迷茫了,在心里一直有疑问,在本科写程序的时候一直就拿数组名当指针用啊,没什么问题啊,但是后来想了想,有了点灵感,就写下来,不知道自己琢磨的是否通透,欢迎交流学习。
首先说明数组名为什么不是指针:上例子:
#include <iostream>
using namespace std;
int main()
{
char str[10];
char* pStr = str;
cout << "sizeof(str): \t" << sizeof(str) << endl;
cout << "sizeof(pStr): \t" << sizeof(pStr) << endl;
system("pause");
return 0;
}
结果:
这个例子就可以70%让我认为数组名不是指针(我当时所想,为什么是70%,我想的是也许是sizeof内部实现造成的呢,看到指针就输出4,看到指针是数组就输出数组的长度),但我又一想,没必要这样吧,完全可以用另一个函数输出数组长度,再找证据。
#include <iostream>
using std::cout;
using std::endl;
int main()
{
char str1[10] = "I love U.";
char str2[10];
strcpy(str2, str1);
cout << "string array 1: " << str1 << endl;
cout << "string array 2: " << str2 << endl;
system("pause");
return 0;
}
这个例子有说明数组名可以做指针,但是他是指针常量,为什么:下面的程序成立吗?
1. int intArray[10];
2. intArray++;
所以总结一下:
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!
解释下(1)通过第一个例子可以看出数组名确实指代的一种数据结构,所以两种sizeof输出的回不一样,(2)
通过第二个例子可以说明数组名可以作为常量指针,为什么是常量指针?下面是我的思考:
之所以可以作为常量指针是因为要控制数组在内存中的位置,比如数组int a[10], a如果作为变量指针的话,“a+1”就会使整个数组向后移动,导致最后一位访问出问题,也就是现在的a[0],就是当初a[1]的位置,这是一个思考。
(3)指针就是一种变量,用来存放地址,指向那,存放哪的地址。
总结就是:数组名不是指针,但是可以外延成指针,但是这就又带来了新一轮的思考,数组名这个结构是怎么设计的,他怎么携带的信息?让他指代一种数据结构,然后外延有可以看做一种指针来用?
更新~~~~~~~~~~~~~~~~~~~~~~~~~~~我是分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
思考了一会觉得又有了新的感悟:
数组名指代的是一种数据结构,说白了就是一段连续内存的地址,就和int,double一样,他之所以是常量指针,上面已经分析,我自己所想:其实数组名就是那一段内存的开头地址(const的),所以sizeof(数组名),就像sizeof(int)一样输出占用内存大小,而指针变量是指向那段地址的,所以就可以变了,sizeof(指针)就是4(32位);所以数组名也是地址所以可以延伸为指针使用。