再论数组与指针

话说已经好久没有进行理论知识补充了,前几天又看到一个朋友的工资上万了,到百度工作去了,真是无限仰慕啊

不废话了,再说下自己对数组的新认识吧,算是一个以前的一个误解了,今天晚上看c专家与编程,又得到了新的认识

先把代码贴出来

#include <iostream>
using namespace std;
int main()
{
    int a[10];
    int *p;
    int i=0;
    for (i=0; i<10; ++i)
         a[i]=i;
    p=a;
    for (i=0; i<10; ++i)
         *p++=0;
    //这里*p++换成p[i]    
    //p=a;
    for (i=0; i<10; ++i)
        cout<<"a[i]="<<a[i]<<" *p++="<<*p++<<endl;
   //这里一样    
    while (1);
    return 0;
}

 

好了,大家可以预期一下结果了,

第一种:  两个数组都是0

第二种: a全部为0   如果上面加上注释的p=a话,那就是一样的了

 

总结一下,过去一直是数组和指针混用。就如刚刚两种形式,第二种完全是把指针当成数组了,但是却没有申请大小

以后要注意不能指针,数组混用,要不然被别人认为你什么都不懂,这算是一个新的认识吧,仅此记下。

你要是动态申请数组的话,那还是数组,指针是没有大小限制的。

 

下面再贴出一代码,要求读者自己思考预计结果,并分析原因

#include <iostream>
using namespace std;
char ga[7]={"123456"};
void f1(char ca[])
{
     cout<<&ca<<endl;
     cout<<&(ca[0])<<endl;
     cout<<&(ca[1])<<endl;
}
void f2(char *pa)
{
     cout<<&pa<<endl;
     cout<<&(pa[0])<<endl;
     cout<<&(pa[1])<<endl;
}

int main()
{
    cout<<&ga<<endl;
    cout<<&(ga[0])<<endl;
    cout<<&(ga[1])<<endl;
    f1(ga);
    f2(ga);
    while (1);
    return 0;
}


下面是正确输出结果

0x43f000
123456
23456
0x22ff20
123456
23456
0x22ff20
123456
23456

1.1这里主要分析下第一个地址与后面地址为什么不同,不对,应该是后面的地址与第一个地址为什么不同

经我分析大概为:  这个是以传值方式进行的,也就是       对实参做一部分拷贝并传递给调用的函数,函数不能修改作为实参的实际变量值,而只能修改传递给他的那份拷贝

可以说 存储这份拷贝的肯定是一个新的地址,故得到上述的结果应该是情理之中的

1.2当然还有一个问题,这里数组参数的地址和数组参数的第一个元素的地址竟然不一样????

这里要注意了,输出的是 &ga    这里是地址的地址

而                           &(ga[0])是值的地址

1.3最后还有一个问题,就是问什么输出的是字符串呢?

具体的大家可以看这里

这里我们改成这样就可以了

    //cout<<&ga<<endl;
    //cout<<(void*)&(ga[0])<<endl;
//cout<<(void*)&(ga[1])<<endl;

想想 我们用c语言 是怎么实现输出模式的,一样的这里只是一个输出样式的表达而已

printf ("%#x\n",&ga);
    printf ("%#x\n",&(ga[0]));
    printf ("%#x\n",&(ga[1]));



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值