指针与一维数组

作者在 2011-09-06 11:55:36 发布以下内容
/*
时间:2011年9月6日11:54:38
目的:学习掌握指针与一维数组的关系和用法
*/

# include <stdio.h>

//函数用来输出任何一个一维数组的内容
void output (int * PArr,int len)    //确定一个数组需要两个形参,1是数组的首个元素的地址,2是数组的长度
                                    
//必须要有长度,因为数组不像字符串有结束的标志            
{
    int i;
    
    for (i=0; i<len; ++i)
    {
        //    printf("%d ", PArr[i] );    //PArr是个指针变量,则PArr[i]等价于*(PArr+i),如果改为执行下面的语句,结果一样
        printf("%d ", *(PArr+i) );
    }
    printf("\n");
    return;
}

//函数用来改变一维数组中的一个元素
void change (int * PArr, int len)
{
    PArr[3]=88;                //在被调函数中操作PArr[i]与在主函数中直接操作数组的感觉差不多,非常方便
    
    return;
}

int main (void)
{
    int a[5] = {1,2,3,4,5};        //a是一维数组a[5]的数组名
    int b[5] = {-1,-2,-3,4,5};
    
    
    //a = b;        //数组名是个指针常量,不能当做变量来赋值。报错error C2106: '=' : left operand must be l-value
    
//a = 3;        //这样赋值也不行,会报错error C2440: '=' : cannot convert from 'const int' to 'int [5]'
    
    printf("%#X\n",&a[0]);    //输出0X12FF6C,这里是对数组第一个元素取地址,用16进制输出
    printf("%#X\n",a);        //输出也是0X12FF6C,可见a存放的是数组第一个元素的地址
    
    output (a,5);        //a作为指针常量,是int *型的,如果函数形参定义为int型,会报错error C2664: 'output' : cannot convert parameter 1 from 'int [5]' to 'int'
                        
//上面函数调用结束后,输出1 2 3 4 5,即a[5]数组的内容

    
//output (&a,5);    //a存放的是数组第一个元素的地址,已经是地址了,不能再取地址,否则报错error C2664: 'output' : cannot convert parameter 1 from 'int (*)[5]' to 'int *'
    output (&a[0],5);    //这样写是可以的
    output (a,6);        //下标越界,输出有错误,1 2 3 4 5 1245120
    
    change (a,5);        
    output (a,5);        //a存放的是a[0]的地址,即a指向a[0];调用函数后,形参PArr也指向a[0]
                        
//PArr和a是不同的变量,但是类型相同,内容相同,可以理解为PArr是a的拷贝
                        
//PArr[3]等价于*(PArr+3),也就是以 PArr+3 的内容为地址的 元素 的内容。
                        
//由于PArr 存放的是 a[0]的地址,而数组中元素的地址又是连续的
                        
//所以PArr+3里存放的,实际是a[0]后面数三个,也就数组第四个元素 a[3]的地址
                        
//那么PArr[3],就是以 元素a[3]的地址 为地址的变量,即元素a[3]本身
                        
//由此,改变函数为函数中PArr[3] 赋值,可以改变 a[3]的值
                        
//简单描述一下:PArr[i] == *(PArr+i) == *(a+i) == a[i]
                        
//调用完change函数后,输出结果1 2 3 88 5,第4个元素a[3]被改变了

    printf ("%d\n",a[3] );
    printf ("%d\n",*(a+3) );    //两条语句都输出88,a[i] 也等价于 *(a+i)

    return 0;
}

/*
在VC++6.0中的输出结果为:
————————————
0X12FF6C
0X12FF6C
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5 1245120
1 2 3 88 5
88
88
Press any key to continue
————————————

总结:
——————————————
一维数组名的含义:
1. 一维数组名是个指针常量
2. 他存放的是数组第一个元素的地址

指针与下标的关系
如果p是指针变量,那么p[i] 等价于 *(P+i)

确定一个一维数组需要几个参数?
1. 第一个元素的地址
2. 数组的长度(元素的个数)
*/
郝斌视频笔记 | 阅读 1111 次
文章评论,共0条
游客请输入验证码
最新评论