数组名与指针

       在本科毕业前,一直以为数组名就是指针,但是最近看了一些技术文章和与一些技术大佬的讨论,我开始迷茫了,在心里一直有疑问,在本科写程序的时候一直就拿数组名当指针用啊,没什么问题啊,但是后来想了想,有了点灵感,就写下来,不知道自己琢磨的是否通透,欢迎交流学习。

       首先说明数组名为什么不是指针:上例子:

#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位);所以数组名也是地址所以可以延伸为指针使用。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值