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

第九章 指針

第二節 變量的指針和指向變量的指針變量-1

1. 指針變量的定義

  • 變量的指針就是變量的地址,我們可以定義一個指向變量的指針變量,這種指針變量,我們在定義的時候,會引入一個*,在定義的語句中,表示"這是一個指針變量"

  • 指針變量定義的一般形式: 類型標識符 *標識符 ,標識符就是指針變量的名字

int i //普通變量
//指針變量定義是,變量名前有個*,這個需要區別
int *mypoint; // 定義兩個指針變量,這個指針變量,指向整型變量

float *mp3;//指向實型變量的指針
  • 如何讓整型指針變量指向一個整型變量,可以用賦值語句是一個整型指針變量指向一個整型變量(普通變量)
int i=10;
// &是取地址符, 等價與mypoint1指向i
int *mypoint = &i;
  • 說明:
  1. 定義指針變量的時候,指針變量前是有*的,表示正在定義一個指針變量,

  2. 但是使用指針變量的時候,指針變量名前是沒有*的,指針變量名是mypoint

  3. 一個指針變量只能指向同一個類型的變量(普通變量)

int i=1;
float j = 2.0;
float *mypoint;
mypoint = &i; //錯誤
mypoint = &j; // 正確,類型相匹配

2. 指針變量的引用

  • 牢記: 指針變量中只存放地址,不要將一個整型變量賦值給一個指針變量
int *mypoint = 4;//mypoint是指針變量,而4是整數
  • 指針變量相關的運算符有兩個
  1. &: 取地址符, scanf()

  2. *: 指針運算符(間接訪問運算符):

a) 乘法運算符, 3*4

b) 定義指針變量的時候我們使用’*’,這個叫指針運算符,若這個*不出現在指針運算定義的場合,也不是乘法運算符,那麼這個*依舊是指針運算符,只不過代表的是該指針變量所指向的變量

#include <iostream>

int main() {

    int a=100, b=200;
    int *p1, *p2;//這裏*表示這兩個變量是兩個指針變量
    p1 = &a;//把變量a的地址賦給了p1,也就是說現在p1指向了a
    p2 = &b;

    printf("a: %d, b: %d\n", a, b);
    printf("*p1: %d, *p2: %d", *p1, *p2);//==> *p1 == a, *p2 == b

    return 0;
}

解析(部分常見用法解析)

  • &*p1: 取地址運算符和指針運算符優先級相同,自右至左結合的,所以可以看作&(*p1), (*p1)代表但是p1指向的變量,
    上例中爲a, &(*p1)等價與&a,也就是p1.

  • *&a:取地址運算符和指針運算符優先級相同,自右至左結合的,所以可以看作*(&a),上例可以看作*(p1),
    也就等價於p1指向的變量,最終結果等價於a.

int d = *&a;
//也就等價於
int d = a;
  • (*p)++: *p1是a, 所以等價於a++;

  • *p++: ++和*是同級的,從右到左結合,所以等價於*(p++),

int i=5;
i++; // i=i+1
//同理
int *p;
//同理,指針變量自加1,也就是變量p中的內容也要自加
//但是具體自加的數值和該指針變量所指向的變量類型有關,如果是整型,則地址增加4,int佔4個字節
//意味着p指向下一個變量
*p++
#include <iostream>

int main() {

    int a = 100, b = 200;
    int *p1, *p2;//這裏*表示這兩個變量是兩個指針變量
    p1 = &a;//把變量a的地址賦給了p1,也就是說現在p1指向了a
    p2 = &b;

    printf("a: %d, b: %d\n", a, b);
    printf("*p1: %d, *p2: %d\n", *p1, *p2);//==> *p1 == a, *p2 == b
    
//    printf("(*p1)++: %d\n", (*p1)++);
    // 一定要注意這種用法
    printf("*p1++: %d\n", *p1++);//這裏輸出還是爲100,因爲是先輸出*p1,然後再將p1的值自加
    printf("*++p1: %d\n", *++p1);//這裏輸出是200,p1先自加,再輸出;

    return 0;
}
  • 指針的互相賦值
#include <iostream>

int main() {
    // pmax指向大值,pmin指向小值
    //僅作演示,方法不是最優
    int *pmax, *pmin, *p, a, b;
    a = 1;
    b = 8;
    pmax = &a;
    pmin = &b;
    if(a<b){
        p = pmax;
        pmax=pmin;
        pmin = p;
    }
    printf("pmax: %d, pmin: %d\n", *pmax, *pmin);

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章