爆個猛料 很猛的 米哈游7月 又有新崗位啦!!!!不打卡彈性工作。 抓緊金7銀8面試機會,年中崗位多、急、需求量大,offer流程快。 現招:技術(演算法、前端、後臺、大數據、安卓ios測試,C++, 游戲開發,客戶端開發,Unity開發,引擎開發)等,上海,新加坡 美國均有崗位,歡迎來撩。 公司福利 ...
7 指針
7.1 指針基本概念
指針的作用: 可通過指針間接訪問記憶體
- 記憶體編號從0開始記錄的,一般用十六進位數表示
- 可以利用指針變數保存地址
7.2 指針變數的定義和使用
指針變數定義語法: 數據類型 *變數名;
示例:
#include<iostream>
using namespace std;
int main()
{
//1、定義指針
int a = 10;
//2、指定定義的語法:數據類型*指針變數;
int* p;
//3、讓指針記錄變數的a的地址
p = &a;
cout << "a的地址為:" << &a << endl;
cout << "指針p為:" << p << endl;
//4、使用指針
//可以通過解引用的方式來找到指針指向的記憶體
//指針前*代表解引用,找到指針指向記憶體中的數據
*p = 1000;
cout << "a = " << a << endl;
cout << "*p = " << *p << endl;
system("pause");
return 0;
}
7.3 指針所占的記憶體空間
提問:指針也是種數據類型,那麼這種數據類型占用多少記憶體空間?
回答:
- 在32位操作系統中,占4個位元組空間
- 在64位操作系統中,占8個位元組空間
示例:
#include<iostream>
using namespace std;
int main()
{
//指針所占的記憶體空間大小?
int a = 10;
int* p = &a;
cout << "sizeof int * = " << sizeof(int*) << endl;
cout << "sizeof int * = " << sizeof(p) << endl;
system("pause");
return 0;
}
7.4 空指針和野指針
空指針:指針變數指向記憶體中編號為0的空間
用途:初始化指針變數
註意:空指針指向的記憶體是不可以訪問的
示例1:
#include<iostream>
using namespace std;
int main()
{
//空指針
//1、空指針用於給指針變數進行初始化
int* p = NULL;
//2、空指針是不可以進行訪問的
// 0~255之間的記憶體編號是系統占用的,因此不可以訪問的
//*p = 100;
cout << *p << endl;
system("pause");
return 0;
}
野外指針:指針變數指向非法的記憶體空間
示例2:
#include<iostream>
using namespace std;
int main()
{
//野指針
//在程式中,避免出現野指針
int* p = (int*)0x1100;
cout << *p << endl;
system("pause");
return 0;
}
7.5 const修飾指針
const 修飾指針有三種情況:
- const修飾指針 ---常量指針
- const修飾常量 ---指針常量
- const即修飾指針,又修飾常量
特點:
- 常量指針:
const int* p = &a;
,特點:指針的指向可以修改,但是指針的值不可以修改 - 指針常量:
int* const p = &a;
,特點:指針的指向不可以改,指針指向的值可以改 - 既修飾指針又修飾常量:
const int* const p =&a;
,特點:指針指向,和指針指向的值都不可修改。
示例:
#include<iostream>
using namespace std;
int main()
{
//1、const修飾指針
int a = 10;
int b = 10;
const int* p = &a;
//指針指向的值不可以改,指針的指向可以改
//*p =20; //錯誤操作
p = &b; //正確操作
//2、const修飾常量
int* const p2 = &a;
//指針的指向不可以改,指針真相的值可以改
*p2 = 100;//正確操作
//p2 = &b;//錯誤操作,指針的指向不可以改
//3、const修飾指針和常量
const int* const p2 = &a;
//指針的指向和指針指向的值都不可以修改
//*p3 = 10;//錯誤操作
//p3 = &b;//錯誤操作
system("pause");
return 0;
}
技巧:看const右側緊跟的是指針還是常量。
7.6 指針和數組
作用:利用指針訪問數組中元素
示例:
#include<iostream>
using namespace std;
int main()
{
//指針和數組
//利用指針訪問數組中的元素
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
cout << "第一個元素為:" << arr[0] << endl;
int* p = arr; //arr就是數組的首地址
cout << "利用指針訪問第一個元素:" << *p << endl;
p++;//讓指針向後偏移4個位元組;
cout << "利用指針訪問第二個元素:" << *p << endl;
cout << "利用指針遍曆數組" << endl;
int* p2 = arr;
for (int i = 0; i < 10; i++)
{
cout << *p2 << endl;
p2++;
}
system("pause");
return 0;
}
7.7 指針和函數
作用:利用指針做函數參數,可以修改實參的值
#include<iostream>
using namespace std;
//實現兩個數字進行交換
void swap01(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "swap01 中 a = " << a << endl;
cout << "swap01 中 b = " << b << endl;
}
void swap02(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
//指針和函數
//1、值傳遞
int a = 10;
int b = 20;
swap01(a, b);//值傳遞不會改變實參
cout << "值傳遞" << endl;
cout << "main 中 a = " << a << endl;
cout << "main 中 b = " << b << endl;
//2、地址傳遞
swap02(&a, &b);//地址傳遞會改變實參
cout << "地址傳遞" << endl;
cout << "main 中 a = " << a << endl;
cout << "main 中 b = " << b << endl;
system("pause");
return 0;
}
7.8 指針、數組、函數
案例描述:封裝一個函數,利用冒泡排序,實現對整型數組的升序排列。
例如:int arr[10] = {4,3,6,9,1,2,10,8,7,5};
示例:
#include <iostream>
using namespace std;
//冒泡排序函數
//參數1:數組首地址,參數2:數組長度
void bubbleSort(int* arr,int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
//如果j >j+1的值,交換數字
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//列印數組
void printArray(int* arr, int len)
{
for (int i = 0; i < len ; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
//1、先創建數組
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
//數組長度
int len = sizeof(arr) / sizeof(arr[0]);
//2、創建函數,實現冒泡排序
bubbleSort(arr,len);
//3、列印排序後的數組
printArray(arr, len);
system("pause");
return 0;
}