再论数组与指针

来源:互联网 发布:嘉兴南湖行知小学 编辑:程序博客网 时间:2024/06/06 23:50

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

不废话了,再说下自己对数组的新认识吧,算是一个以前的一个误解了,今天晚上看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]));



 

 

原创粉丝点击