C语言基础学习3:数组与指针

数组元素的指针就是数组元素的地址。

1、指向数组元素的指针

C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中的首元素(即序列为0的元素)的地址。

int a[10];
int *p1,*p2;
p1 = &a[0];
p2 = a;

p1和p2指向同一个数组a[10]。

2、通过指针引用数组元素

按C语言的规定,如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,而不是将p的值(地址)简单的加1。

如果p的初值为&a[0],则

(1) p+i 和 a+i就是a[i]的地址。

(2) *(p+i) 或 *(a+i)是p+i 和 a+i 所指向的数组元素,即a[i]。

(3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。

for(p=a;p<a+10;p++)
   printf("%d",*p);

(4)可以通过改变指针变量指向不同的元素。注意上面的p++不能改为a++,原因是数组a虽然也代表数组首元素的地址,但它是一个指针常量,它的值在程序运行期间是固定不变的。

(5)注意指针的指向。

#include <stdio.h>
void main()
{
    int *p,i,a[10];
    p = a;
    for(i=0;i<10;i++)
        scanf("%d",p++);
    printf("\n");
    p = a; //作用是将指针的位置重新定位到数组首地址处
    for(i=0;i<10;i++,p++)
    {
        printf("%d",*p);
        printf("\n");
    }
    return;
}

(6)注意指针变量的运算

i.p++或(p+=1).使p指向下一元素,即a[1]。若再执行*p,则得到下一个元素a[1]的值。

ii.*p++。由于++和*同优先级,结合方向为自右向左,因此它等价于*(p++)。作用是先得到p指向的变量即(*p),然后再使p+1.

for(i=0;i<10;i++)
    printf("%d",*p++);

与(3)等价。

iii.*(p++)与*(++p)作用不同。前者是先取*p值,然后使p加1.后者是先使p+1,然后再取*p。若p初值为a(即&a[0]),则*(p++)为a[0],*(++p)为a[1]。

iv.++(*p)表示p所指向的元素值加1,如果p=a,则++(*p)相当于++(a[0]),注意是元素a[0]加1,不是指针p加1。

v.如果p当前指向a数组中第i个元素,则

*(p--)相当于a[i--],先对p进行*运算,再使p自减。

*(++p)相当于a[++i],先使p自加,再作*运算。

*(--p)相当于a[--i],先使p自减,再作*运算。

3、用数组名作为函数参数

实参数组名代表一个固定的地址,或者是指针常量,但形参数组并不是一个固定的地址值,而是作为指针变量,并不是真正地开辟一个数组空间,在函数调用开始时,它的值等于实参数组首元素的地址,在函数执行期间,它可以再被赋值。实参和形参都可以使用数组名或指针变量。

4、多维数组与指针

C语言基础学习3:数组与指针,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。