c語言入門到c++使用高手: c語言入門之指針(四)

第九章 指針

第四節 數組的指針和指向數組指針的指針變量-1

1. 指向數組元素的指針變量的定義和賦值

  • 數組指針 是指 數組開始的地址,數組元素的指針就是數組元素的地址

  • 只要是數組,那麼數組元素的內存一定是挨着的

#include <iostream>

int main() {
    int a[5] = {5, 6, 7, 8, 9}; //能夠引用的是a[0]-a[4]
    a[3] = 6;//下標法引用數組元素,也可以使用指針引用數組元素
    // a == &a[0]
    int *p; // 指針變量,整型指針變量,和數組a類型相同
    //把a[0]元素的地址賦給指針變量p,把p指向數組變量第0號元素
    //也就等價於p=a
    p = &a[0];
    return 0;
}
  • 定義指針變量時也可以給指針變量賦予初值
int *p = &a[0];
//或者
int *p = a;

2. 通過指針引用數組元素

仔細看下面的效果

  • *p=19; // 相當於修改a[0], 使得 a[0] = 19

  • p = p + 1; //因爲p是整型,相當於地址增加4個字節,跳過一個完整的整型,也就是p的值爲a[1]的地址,
    即p指向a[1]

  • p + i 或者是 a + i // i是數組元素的下標(0-4),假設p指向a[0]的話,那麼a+i或p+i就是數組元素a[i]的地址,
    也就是說,它們指向了數組a的第i個元素,也就是說p+3或者a+3的值爲&a[3],也就是說都指向a[3].

結論是 a+i或者p+i都是地址,既然是地址,就可以賦給指針變量

  • *(p+i)或者*(a+i),也就等價於a[i]的值

  • p[i] // i是數組元素的下標(0-4),p[i]= *(p+i) = a[i]

  • 引用數組元素有很多方法:
    a[i], p[i], *(p+i), *(a+i)

#include <iostream>

int main() {
    int a[5] = {5, 6, 7, 8, 9}; //能夠引用的是a[0]-a[4]
    a[3] = 6;//下標法引用數組元素,也可以使用指針引用數組元素
    // a == &a[0]
    int *p; // 指針變量,整型指針變量,和數組a類型相同
    //把a[0]元素的地址賦給指針變量p,把p指向數組變量第0號元素
    //也就等價於p=a
    p = &a[0];
    *p = 19;//等價與a[0] = 19
    p = p + 1;
    *p = 100;

    *(p+2) = 102;
    p = a;
    printf("p[2]: %d\n", p[2]);
    return 0;
}

  • 實例
#include <iostream>

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    int *p;
    int i;
    p = a;
    for (i = 0; i < 5; i++) {
        printf("a[%d]: %d, ", i, a[i]);
        printf("*(a+%d): %d, ", i, *(a + i));
        printf("p[%d]: %d, ", i, p[i]);
        printf("*(a+%d): %d \n", i, *(a + i));
    }
    // 效率更高
    for(p=a;p<(a+5);p++){
        printf("*p: %d \n", *p);

    }
    return 0;
}
  • 注意事項
  1. 數組首地址不能進行++操作,不能寫成a++

  2. a[5]按照*(a+5)來進行計算地址,地址是存在的,但是不能給a[5]賦值,數組越界了,不能使用

  • *p++:優先級相同,並且都是從右到左結合,所以等價於*(p++), 得到p指向的變量的值(*p), 再考慮自身p自加1
#include <iostream>

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    int *p;
    p = a;
    // 打印p的值, p再指向a[1]
    printf("*p++: %d", *p++);
    return 0;
}
  • *++p:和*p++是不同的,所以等價於,p先加1,然後再取地址
#include <iostream>

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    int *p;
    p = a;
    // p先指向a[1], 打印出a[1]
    printf("*++p: %d", *++p);
    return 0;
}
  • (*p)++:p所指向的元素加1, 相當於a[0]++,數組元素值加1
#include <iostream>

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    int *p;
    p = a;
    // 相當於a[0]++
    (*p)++;
    printf("a[0]: %d", a[0]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章