一、概念
1.1 指針的原理
找到一個比較精練的概述指針原理的句子:
指針變量就是在內存中保存變量的地址,然后通過地址來訪問數據。
int a = 1;
int* p = &a;
cout << p << endl;
009DFEB4
可以知道變量p在內存中的值就是a的地址,地址一般是16進制數。
然后我們可以通過解引用的方式來輸出a的值。所謂解引用,就是通過指針的值即a的地址來找到a的值,具體方法就是在指針變量前加*。
cout << *p << endl;
可以知道,*p的值為1。
1.2 常量修飾指針
常量修飾指針分為常量指針、指針常量、常量指針和指針常量疊加。
1.2.1常量指針
常量指針通過const關鍵字修飾指針。
它的特點是指針變量指向的值不可以進行修改,但指向可以修改。
int a = 1;
int b = 2;
const int* p = &a;
*p = 2;//錯誤
p = &b;//正確
cout << *p << endl;
可以知道,*p的值為2。
1.2.2指針常量
指針常量是通過const來修飾指針變量p。
它的特點是指向的值可以進行修改,但指向不可以修改。
int a = 1;
int b = 2;int* const p = &a;
cout << *p << endl;
cout << p << endl;
//p = &b;錯誤
*p = 2;//正確
cout << *p << endl;
cout << p << endl;
1
0102FBE0
2
0102FBE0
可以看到,指針的值即指向的地址沒有改變,其指向的值發生變化。
1.2.3常量指針和指針常量疊加
那const也可以既修飾指針又修飾指針變量的值,那么指向的值不可以進行修改,指向即地址也不可以修改。
const int* const p = &a;
其實簡單的總結:const后面的值不能發生改變。
1.3 野指針
野指針是指指向非法的內存空間的指針。
1.指定義指針時未做初始化,因而不明確所指向的位置。
int * c = (int*)0x1234;//給指針自定義地址名,沒有初始化,會變成野指針
int* d;//沒有初始化,也為野指針
2.指new賦值的指針釋放后沒有歸NULL
int* e = new int(1);cout << *e << endl;//只有指針b是正常的,現在將b釋放,也會發生報錯if(e != NULL){delete e;//此時e為野指針,需要將e置為NULLe = NULL;}
3.指針操作超越了作用域
1.4 this指針
C++中this指針指向的是被調用的成員函數所屬的對象。
class Person
{
public:Person(int age){this->age = age;}int age;
};
1.5 空指針
是指指針指向內存編號為0的空間,相當于初始化,不可以訪問。
int *p = NULL;
二、程序應用
2.1 在數組中應用指針
2.1.1 一維數組
我們發現數組的變量名其實就是地址,所以不需要用&來取地址。
int a[3] = {1, 2, 3};int* p = a;//p表示數組a中第一個元素的地址,p[0]則表示地址中的值即1。cout<<a<<endl;cout<<p[0]<<endl;for (int i = 0; i < 3; i++){cout << *p << endl;p++;//++相當于從首地址依次加4個字節到下一個數組元素的地址}
2.1.2 二維數組
int a[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
cout << a << endl;
int* p = a[0];//指向第0行。
int* p1 = a;//錯誤,二維數組的數組名表示的是第一個元素的地址,第一個元素是值數組的第0行,
所以不能指向整行,只能指向整行的元素。
cout << *p << endl;//也表示0行的第一個元素。
cout << p[0] << endl;//表示0行的第一個元素。
00B1FA0C
1
1
3
2.2 在函數中應用指針
int delete_1(int* p1, int* p2)
{int temp = *p1;*p1 = *p2;*p2 = temp;return *p1 - *p2;
}
int main()
{int a = 1;int b = 2;int c = delete_1(&a, &b);cout << a << endl;cout << b << endl;cout << c << endl;
}
2
1
1
與值傳遞不同,指針傳遞可以通過改變內存中的值的方法來改變實參。
2.3 實現冒泡排序
void Sort(int* p, int len)
{//實現冒泡排序for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - i - 1; j++){if (p[j] > p[j + 1]){int temp = p[j];p[j] = p[j + 1];p[j + 1] = temp;}} } //交換int var = p[0];p[0] = p[2];p[2] = var;//輸出for (int k = 0; k < len; k++){cout << p[k];}
}
int main()
{int a[5] = {13, 1, 2, 5, 14};int len = sizeof(a) / sizeof(a[0]);Sort(a, len);
}
5211314