C语言学习笔记——指针:指针与一维数组

数组名代表数组的首地址,例如:

int a[10];
int *p=NULL;
p=a;

       其中,数组名a代表数组的首地址(即&a[0]),那么表达式a+i代表数组中下标为i元素a[i]的地址,即&a[i]
       还可以通过使用间接寻址*来引用数组元素。例如:*(a+i)表示取出首地址元素后边第i个元素的内容,即下标为i的元素a[i]
        此外,还可以通过一维数组的指针变量p来引用数组a中的元素,*(p+i)就表示取出p+i所指的内存单元内容,即元素a[i]的值。*(p+i)也可以用它的下表形式p[i]来表示。
C语言学习笔记——指针:指针与一维数组_第1张图片

例如:

# include 
int main(void)
{
    int a[] = {1, 2, 3, 4, 5};
    int *p, *q, *r;
    p = &a[3];  //第一种写法
    printf("*p = %d\n", *p);
    q = a;  //第二种写法
    q = q + 3;
    printf("*q = %d\n", *q);
    r = a;  //第三种写法
    printf("*(r+3) = %d\n", *(r+3));
    return 0;
}

输出结果是:
*p = 4
*q = 4
*(r+3) = 4
注意:(1)与通过*(a+i)来引用数组元素a[i]不同的是由于指针变量p不一定永远都指向数组元素的首地址&a[0],因此仅当指针变量p指向数组元素首地址&a[0]时,*(p+i)才是对a[i]的引用,否则,如果通过增1运算改变指针变量p的指向,使p指向a[i],那么*)就是对a[i]的引用。
(2)数组名a是一个地址常量,不能通过赋值操作改变它的值。指针变量p是一个变量,可以通过赋值运算改变它的值,从而使p指向数组中的其他元素。
(3)虽然p+1p++都指向当前指针所指向单元的下一个元素但是p+1不改变当前指针的指向,而p++相当于执行p=p+1,因此p++操作改变了指针p的指向,表示指针变量p向前移动使其指向下一个元素。
(4)p+1增加1*sizeof(指针的基类型)
例如:

# include 
int main(void)
{
    int a[] = {1, 2, 3, 4, 5};
    int *p = a;
    printf("p = %d, p + 1 = %d\n", p, p+1);
    return 0;
 } 

输出结果是:
p = 1638196, p + 1 = 1638200

参考文献:C语言大学实用教程

你可能感兴趣的:(C/C++)