直接引用
- 通過變量名引用變量,由系統自動完成變量名和其存儲地址之間的轉換,稱為變量的"直接引用"方式
char a;
a = 10;
程序對變量的讀寫操作,實際上是對變量所在的存儲空間進行寫入或取出數據。就上面的代碼而言,系統會自動將變量名a轉換為變量的存儲地址,根據地址找到變量a的存儲空間,然后再將數據10以2進制的形式放入變量a的存儲空間中
指針-----間接引用
-
以變量a為例:首先將變量a的地址存放在另一個變量中,比如存放在變量b中,然后通過變量b來間接引用變量a,間接讀寫變量a的值。這就是"間接引用"。
如果程序通過"間接引用"的方式來修改a的值,可以這樣做:先根據 變量名b 獲取 變量b 的地址ffc2,取出變量b中存儲的內容ffc1,也就是變量a的地址,再根據變量a的地址ffc1找到a的存儲空間,然后修改里面的數據。
- 總結一句:用來存放變量地址的變量,就稱為"指針變量"。在上面的情況下,變量b就是個"指針變量",我們可以說指針變量b指向變量a。
指針的初始化
- 先定義后初始化
// 定義int類型的變量a
int a = 10;
// 定義一個指針變量p
int *p;
// 將變量a的地址賦值給指針變量p,所以指針變量p指向變量a
p = &a;//注意:賦值給p的是變量a的地址&a
- 定義的同時初始化
// 定義int類型的變量a
int a = 10;
// 定義一個指針變量p
// 并將變量a的地址賦值給指針變量p,所以指針變量p指向變量a
int *p = &a;
指針交換兩個變量的值
void change(int *a, int *b) {
// 中間變量
int temp ;
// 取出a指向的變量的值
temp = *a;
// 取出b指向的變量的值,然后賦值給a指向的變量
*a = *b;
// 賦值給b指向的變量
*b = temp;
}
int main(int argc, const char * argv[]) {
int a = 10;
int b = 4;
change(&a, &b);
printf("%d,%d\n",a, b);
return 0;
}
利用指針返回多個參數(這里例子返回兩個)
- 通常情況下,函數只能返回一個返回值。我們可以利用指針返回多個參數
int sunAndMinus(int a, int b, int *p) {
*p = a - b;
return a + b;
}
int main(int argc, const char * argv[]) {
// 定義2個int型變量
int a = 10;
int b = 4;
// 定義2個變量來分別接收和與差
int sum;
int minus;
// 調用函數
sum = sunAndMinus(a, b, &minus);
// 打印和
printf("%d+%d=%d\n", a, b, sum);
// 打印差
printf("%d-%d=%d\n", a, b, minus);
return 0;
}
利用指針遍歷數組元素
- 第一種方式
int main(int argc, const char * argv[]) {
int a[] = {1, 2, 3};
int *p = a;
for (int i = 0; i < 3; i ++) {
printf("a[%d]=%d\n",i ,*(p + i));//p沒有改變
}
//p + i。是地址運算,不是真正的加1,它會根據你的數據類型來判斷p + 幾。比如上面是int 類型,所以當i = 0的時候,p + 0,當i = 1的時候,p + i就變成了p + 2。也就是一次性加2
return 0;
}
-
下面可以看出p + i具體加的是幾。
第二種方式
int main(int argc, const char * argv[]) {
int a[] = {1, 2, 3};
int *p = a;
for (int i = 0; i < 3; i ++) {
printf("a[%d]=%d\n",i ,*(p ++));//p改變了
}
return 0;
}
- 第三種方式
int main(int argc, const char * argv[]) {
int a[] = {1, 2, 3};
for (int i = 0; i < 3; i ++) {
//a代表的是數組a的地址也就是a[0]的地址。同樣 a+i 是很具你的數據類型來定的。和上面 p+i 一樣。
printf("a[%d]=%d\n",i ,*(a+i));
//但是我們不能像上面第二中方式一樣a++,a++相當于a=a+1。因為數組名a,是一個常量,不能進行賦值運算!
}
return 0;
}
利用指針把函數當做參數傳到另一個函數中
//加法
int add(int a, int b) {
return a + b;
}
//減法
int minus(int a, int b) {
return a - b;
}
//乘法
int multiplication(int a, int b) {
return a * b;
}
//------------不改變這個函數的情況下。更換算法
int algorithm(int a, int b, int (*p)(int, int)) {
return p(a, b);
}
int main(int argc, const char * argv[]) {
int result = algorithm(10, 6, multiplication);
printf("%d\n", result);
return 0;
}