第九章 指針
第二節 變量的指針和指向變量的指針變量-1
1. 指針變量的定義
-
變量的指針就是變量的地址,我們可以定義一個指向變量的指針變量,這種指針變量,我們在定義的時候,會引入一個*,在定義的語句中,表示"這是一個指針變量"
-
指針變量定義的一般形式: 類型標識符 *標識符 ,標識符就是指針變量的名字
int i //普通變量
//指針變量定義是,變量名前有個*,這個需要區別
int *mypoint; // 定義兩個指針變量,這個指針變量,指向整型變量
float *mp3;//指向實型變量的指針
- 如何讓整型指針變量指向一個整型變量,可以用賦值語句是一個整型指針變量指向一個整型變量(普通變量)
int i=10;
// &是取地址符, 等價與mypoint1指向i
int *mypoint = &i;
- 說明:
-
定義指針變量的時候,指針變量前是有*的,表示正在定義一個指針變量,
-
但是使用指針變量的時候,指針變量名前是沒有*的,指針變量名是mypoint
-
一個指針變量只能指向同一個類型的變量(普通變量)
int i=1;
float j = 2.0;
float *mypoint;
mypoint = &i; //錯誤
mypoint = &j; // 正確,類型相匹配
2. 指針變量的引用
- 牢記: 指針變量中只存放地址,不要將一個整型變量賦值給一個指針變量
int *mypoint = 4;//mypoint是指針變量,而4是整數
- 指針變量相關的運算符有兩個
-
&: 取地址符, scanf()
-
*: 指針運算符(間接訪問運算符):
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;
}