C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】
C++| 匠心之作 從0到1入門學編程【視頻+課件+筆記+源碼】
目錄
7 指針
7.1 指針的基本概念
7.2 指針變量的定義和使用
示例
7.3 指針所占內存空間
示例
7.4 空指針和野指針
示例1:空指針
示例2:野指針
總結
7.5 const修飾指針
1、const修飾指針——常量指針
2、const修飾常量——指針常量
3、const既修飾指針,又修飾常量
示例
7.6 指針和數組
示例
7.7 指針和函數
示例
7.8 指針、數組、函數
示例
7 指針
7.1 指針的基本概念
指針的作用: 可以通過指針間接訪問內存。
-
內存編號是從0開始記錄的,一般用十六進制數字表示。
-
可以利用指針變量保存地址。
內存都是有地址編號的,從0開始記錄,一般用十六進制數字來表示編號,可以利用指針來記錄地址編號。
int a = 10; // 4字節空間大小
每創建一個變量,都要去記錄地址編號,不太方便去使用這個數據,所以才會有這個變量。
知道地址編號,也可以拿到數據。指針就是一個地址,記錄地址編號!
7.2 指針變量的定義和使用
指針變量定義語法:數據類型 * 變量名;
示例
指針變量和普通變量的區別:
-
普通變量存放的是數據,指針變量存放的是地址。
-
指針變量可以通過 “ * ” 操作符,操作指針變量指向的內存空間,這個過程稱為解引用。
?通過p可以找到內存,通過*p可以修改內存。
指針的作用(用途):可以間接地訪問內存,并且對其進行讀和寫的操作(修改、訪問)!
??
#include <iostream> using namespace std;int main() {//1、指針的定義int a = 10; //定義整型變量a//指針定義的語法:數據類型 * 指針變量名 ;int *p; // point代表指針//指針變量賦值 讓指針記錄變量a的地址p = &a; //指針p指向(等于)變量a的地址【取地址符號& 取變量a的地址】建立變量與指針之間的關系cout << "a的地址為:" << &a << endl; //打印數據a的地址:0x61fe14// cout << "a的地址為:" << (int)&a << endl; //十六進制轉整型cout << "指針p為:" << p << endl; //打印指針變量p:0x61fe14【指針就是一個地址,記錄地址編號!】//2、指針的使用//可以通過“解引用”的方式來找到指針指向的內存//指針前加一個* 代表 解引用,找到指針指向的內存中的數據//通過*操作指針變量指向的內存cout << "*p = " << *p << endl; // 10*p = 1000; //解引用 通過指針間接地找到了a的內存 通過解引用拿到p指向的內存中的數據(進行 修改、讀取)cout << "a = " << a << endl;cout << "*p = " << *p << endl;system("pause");return 0; }總結1: 我們可以通過 & 符號 獲取變量的地址。
總結2:利用指針可以記錄地址。
總結3:對指針變量解引用,可以操作指針指向的內存。
7.3 指針所占內存空間
提問:指針也是種數據類型,那么這種數據類型占用多少內存空間?
總結:所有指針類型在32位操作系統下是4個字節,在64位操作系統下是8字節。
示例
?
#include <iostream> using namespace std;int main() //指針所占內存空間 {int a = 10;// int *p;// p = &a; //指針指向數據a的數據地址int *p = &a; //建立關系//在32位操作系統下,指針是占4個字節空間大小(不管是什么數據類型)//在64位操作系統下,指針是占4個字節空間大小(不管是什么數據類型)cout << *p << endl; //10 * 解引用cout << "sizeof(p) = " << sizeof(p) << endl; //8 查看變量(數據類型)占用的內存空間cout << "sizeof(int *) = " << sizeof(int *) << endl; //8cout << "sizeof(float *) = " << sizeof(float *) << endl; //8cout << "sizeof(double *) = " << sizeof(double *) << endl; //8cout << "sizeof(char *) = " << sizeof(char *) << endl; //8system("pause");return 0; }7.4 空指針和野指針
空指針:指針變量指向內存中編號為0的空間。內存條,都有自己的編號,從0開始遞增。指向編號為0的指針,稱為“空指針”!
用途:初始化指針變量。指針一開始不知道指向哪里好,就指向內存中編號為0的空間。
注意:空指針指向的內存是不可以訪問的。無權利訪問空指針指向的內存。0~255之間的這塊內存,是系統占用的,一旦訪問,就會出錯!
示例1:空指針
#include <iostream> using namespace std;int main() //空指針 {//1、空指針用于給指針變量進行初始化// int * p;//指針指向哪?未知!所以,一般會讓指針指向NULL(空)int *p = NULL; //指針變量p指向內存地址編號為0的空間//2、空指針是不可以進行訪問的//0~255之間的內存編號是系統占用的,因此不可以訪問*p = 100; //直接引用 操作內存//訪問空指針報錯//內存編號0 ~255為系統占用內存,不允許用戶訪問cout << *p << endl;//system("pause");return 0; }示例2:野指針
野指針:指針變量指向非法的內存空間。非法的內存空間:不是使用者申請的內存空間。
#include <iostream> using namespace std;int main() //野指針 在程序中,盡量避免出現野指針 {// int *p = NULL;//指針變量p指向內存地址編號為0x1100的空間【0x1100:十六進制數字】int *p = (int *)0x1100; //變為地址:(int *)強轉為指針類型//0x1100隨便在內存中指向了這樣一個編號,這個編號中的數 無權利操作!沒有申請,無權利操作!//舉例:花錢買房間A(int a = 10; int *p = &a;),沒有權利去房間B(房間B->野指針)cout << *p << endl; //訪問野指針報錯system("pause");return 0; }總結
總結:空指針和野指針都不是我們申請的空間,因此不要訪問。
7.5 const修飾指針
const修飾指針有3種情況:
const 修飾指針 —— 常量指針? ? ? ??const int *p1 = &a;
const 修飾常量 —— 指針常量? ? ? ??int *const p2 = &a;
const 既修飾指針,又修飾常量
1、const修飾指針——常量指針
紅框:被限定,不可以修改;黑線:可以修改。
2、const修飾常量——指針常量
紅線:被限定,不可以修改;黑框:可以修改。
3、const既修飾指針,又修飾常量
示例
?
#include <iostream> using namespace std;int main() {int a = 10;int b = 10;//int *p0 = &a; //普通寫法//1、常量指針(記法:const在前 先常量 后指針)//const修飾的是指針,指針的指向可以更改,指針指向的值不可以更改(可以理解為const 修飾的是解引用 int*,所以指針指向的值不可以更改)const int *p1 = &a;p1 = &b; //正確// *p1 = 20; //錯誤//2、指針常量(記法:int* 在前 先指針 后常量)//const修飾的是常量,指針的指向不可以更改,指針指向的值可以更改(可以理解為const修飾的是指針本身,所以指針指向的值不可以修改)int *const p2 = &a;*p2 = 100; //正確//p2 = &b; //錯誤,指針常量 指針的指向不可以更改//3、const既修飾指針又修飾常量const int *const p3 = &a;//指針的指向和指針指向的值都不可以改//*p3 = 100; //錯誤//p3 = &b; //錯誤system("pause");return 0; }技巧:看const右側緊跟著的是指針還是常量,是指針就是常量指針,是常量就是指針常量。
7.6 指針和數組
作用:利用指針訪問數組中元素。數組:一段連續的空間中,存放了相同類型的數據元素。
示例
??
#include <iostream> using namespace std;int main() {//指針和數組//讓(利用)指針也能訪問數組中的每一個元素int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "第一個元素為:" << arr[0] << endl;int *p = arr; //指向數組的指針 數組是整型的,所以創建整型指針,指向數組的地址 arr數組名就是數組的首地址//指針指向數組首地址,對指針進行解引用的操作,就可以解出數組中的第一個元素cout << "利用指針訪問第一個元素:" << *p << endl; //*p解引用p++; //指向數組中的第二個元素,讓指針向后偏移(移動)4個字節(整型指針)cout << "利用指針訪問第二個元素:" << *p << endl; //*p解引用cout << "利用指針遍歷數組:" << endl;int *p2 = arr;for (int i = 0; i < 10; i++) //利用指針遍歷數組{// cout << arr[i] << endl;cout << *p2 << endl;p2++;}system("pause");return 0; }7.7 指針和函數
作用:利用指針作函數參數,可以修改實參的值。
示例
?
指針保存的是地址。傳遞地址,可以間接地改變實參數據。
#include <iostream> using namespace std;//1、值傳遞:實現兩個數字進行交換 void swap01(int a, int b) {int temp = a;a = b;b = temp;cout << "swap01中 a = " << a << endl;cout << "swap01中 b = " << b << endl; }//2、地址傳遞 void swap02(int *p1, int *p2) {int temp = *p1; //解出內存 解引用*p1 = *p2;*p2 = temp;cout << "swap02中 *p1 = " << *p1 << endl;cout << "swap02中 *p2 = " << *p2 << endl; }int main() //指針和函數 {int a = 10;int b = 20;//1、值傳遞不會改變實參swap01(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;//2、地址傳遞會改變實參//將a、b變量地址傳入函數體中,用指針接受地址【如果是地址傳遞,可以修飾實參】swap02(&a, &b);cout << "a = " << a << endl;cout << "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) //int * arr 也可以寫為int arr[] {for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - 1 - i; j++){if (arr[j] > arr[j + 1]) //如果j > j + 1的值,交換數字{int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}} }//打印數組函數 void printArray(int arr[], int len) //void printArray(int *arr, int len) {for (int i = 0; i < len; i++){// cout << arr[i] << endl;cout << arr[i] << "、";} }int main() {//1、創建一個數組int arr[10] = {4, 3, 6, 9, 1, 2, 10, 8, 7, 5};//數組長度int len = sizeof(arr) / sizeof(int);//2、創建一個函數實現冒泡排序bubbleSort(arr, len); //傳遞數組地址arr:數組名就是數組的首地址//3、打印排序后的數組printArray(arr, len); //傳遞數組地址arrsystem("pause");return 0; }總結:當數組名傳入到函數作為參數時,被退化為指向首元素的指針。
總結
以上是生活随笔為你收集整理的C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++阶段01笔记06【函数(概述、定义
- 下一篇: C++阶段01笔记08【结构体(基本概念