c++中的指針最全總結(jié)
一、指針的基本概念
指針的作用:可以通過(guò)指針間接訪問(wèn)內(nèi)存
- 內(nèi)存編號(hào)是從0開(kāi)始記錄的,一般采用16進(jìn)制數(shù)字表示。
- 可以利用指針變量保存地址。
二、指針變量的定義和使用
指針變量定義語(yǔ)法: 數(shù)據(jù)類型 * 變量名
#include<iostream>
using namespace std;
int main()
{
//1.定義一個(gè)指針
int a = 10;
//指針定義的語(yǔ)法: 數(shù)據(jù)類型 * 指針變量名 ;
int* p;
//讓指針記錄變量a的地址
p = &a;
cout << "a的地址是:" << &a << endl;
cout << "指針p指向的地址是:" << p << endl;
//2.如何使用指針
//可以通過(guò)解引用的方式來(lái)找到指針指向的內(nèi)存
//指針恰加 * 代表解引用,找到指針指向的內(nèi)存中的數(shù)據(jù)
*p = 1000;//將指針指向的內(nèi)存中的數(shù)據(jù)修改為1000
cout << "a的值是:" << a << endl;
cout << "指針p指向的地址中的值是:" << *p << endl;
system("pause");
return 0;
}
三、指針?biāo)嫉膬?nèi)存空間
提問(wèn):指針也是種數(shù)據(jù)類型,那么這種數(shù)據(jù)類型占用多少內(nèi)存空間?

#include<iostream>
using namespace std;
int main()
{
// 指針?biāo)嫉膬?nèi)存空間
int a = 10;
//int* p;
//p = &a;
int* p = &a;
//在32位操作系統(tǒng)下,指針是占用4個(gè)字節(jié)空間大小,不管是什么數(shù)據(jù)類型
//在64位操作系統(tǒng)下,指針是占用8個(gè)字節(jié)空間大小,不管是什么數(shù)據(jù)類型
cout<<"sizeof(int *)="<<sizeof(p)<<endl;
cout << "sizeof(int *)=" << sizeof(int *) << endl;
cout << "sizeof(int *)=" << sizeof(float *) << endl;
cout << "sizeof(int *)=" << sizeof(double *) << endl;
cout << "sizeof(int *)=" << sizeof(char *) << endl;
system("pause");
return 0;
}
四、空指針和野指針
空指針:指針變量指向內(nèi)存編號(hào)為0的空間
用途:初始化指針變量
注意:空指針指向的內(nèi)存是不可以訪問(wèn)的
4.1 空指針
#include<iostream>
using namespace std;
int main()
{
//空指針
//1.空指針用于給指針變量進(jìn)行初始化
int* p = NULL;
//2.空指針是不能進(jìn)行訪問(wèn)的
//0~255之間的內(nèi)存編號(hào)是系統(tǒng)占用的,因此不可以訪問(wèn)
*p=100; //error: dereferencing pointer to incomplete type 'int'
system("pause");
return 0;
}
4.2 野指針
野指針:指針變量指向非法的內(nèi)存空間
注意:空指針野指針都不是我們申請(qǐng)的空間,因此不需要訪問(wèn)。
#include<iostream>
using namespace std;
int main()
{
//野指針
//在程序中,盡量避免出現(xiàn)野指針
int *p =(int*)0x1100;
cout<<*p<<endl; //輸出地址為0x1100處的值,此處為0,所以會(huì)出現(xiàn)野指針錯(cuò)誤
system("pause");
return 0;
}
五、const修飾指針
const修飾指針有三種情況:
- const修飾指針 ----常量指針
- const修飾常量 ---指針常量
- const即修飾指針,又修飾常量



#include <iostream>
using namespace std;
int main()
{
//1.const修飾指針
int a = 10;
int b = 10;
const int* p = &a; //指向常量的指針
//*p = 20; //錯(cuò)誤,不能修改常量指針指向的值
p = &b; //正確,可以修改指針指向的值
//2.const修飾常量
int * const p2 = &a; //指針指向常量,不能修改指針指向的方向,指針指向的值可以改
*p2 = 20; //正確,可以修改指針指向的值
//p2 = &b; //錯(cuò)誤,不能修改指針指向的方向
//3.const修飾指針和常量
//指針指向和指針指向的值都不能修改,只能讀取
const int * const p3=&a;
//*p3 = 20; //錯(cuò)誤,不能修改指針指向的值
//p3 = &b; //錯(cuò)誤,不能修改指針指向的方向
system("pause");
return 0;
}六、指針和數(shù)組
作用:利用指針訪問(wèn)數(shù)組中元素
#include <iostream>
using namespace std;
int main() {
//指針和數(shù)組
//利用指針訪問(wèn)數(shù)組中的元素
int arr[10]= {1,2,3,4,5,6,7,8,9,10};
cout<<"數(shù)組中的第一個(gè)元素:"<<arr[0]<<endl;
int* p = arr;//arr就是數(shù)組的首地址
cout<<"數(shù)組中的第一個(gè)元素的地址:"<<*p<<endl;
p++;//指向數(shù)組的第二個(gè)元素
cout<<"數(shù)組中的第二個(gè)元素的地址:"<<*p<<endl;
p--;//指向數(shù)組的第一個(gè)元素
cout << "利用指針遍歷數(shù)組" << endl;
for (int i = 0; i < 10; i++) {
cout << *(p + i) << " ";
}
cout << endl;
system("pause");
return 0;
}
七、指針和函數(shù)
作用:利用指針做函數(shù)參數(shù),可以修改實(shí)參的值
#include<iostream>
using namespace std;
//實(shí)現(xiàn)兩個(gè)數(shù)字進(jìn)行交換
void swap01(int a, int b) {
int temp = a;
a = b;
b = temp;
cout << "a=" << a << " b=" << b << endl;
}
void swap02(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
//指針和函數(shù)
//1.值傳遞
int a = 10;
int b = 20;
swap01(a, b);
cout << "a=" << a << " b=" << b << endl; //輸出結(jié)果為 a=20 b=10
//2.地址傳遞
//實(shí)參的值會(huì)發(fā)生改變
swap02(&a, &b);
cout << "a=" << a << " b=" << b << endl; //輸出結(jié)果為 a=20 b=10
system("pause");
return 0;
}
八、指針、數(shù)組、函數(shù)(案例)

#include<iostream>
using namespace std;
//冒泡排序函數(shù)
void bubbleSort(int* arr, int len) {
{
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
int main()
{
//1.先常見(jiàn)一個(gè)數(shù)組
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
//2.創(chuàng)建函數(shù),實(shí)現(xiàn)冒泡排序
int len = sizeof(arr) / sizeof(arr[0]);
//3.調(diào)用函數(shù),對(duì)數(shù)組進(jìn)行排序
bubbleSort(arr, len);
cout << "排序后的數(shù)組為:";
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
總結(jié)
到此這篇關(guān)于c++中指針的文章就介紹到這了,更多相關(guān)c++中指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))
下面小編就為大家?guī)?lái)一篇常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
C語(yǔ)言鏈表實(shí)現(xiàn)銷售管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)銷售管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
ON_COMMAND_RANGE多個(gè)按鈕響應(yīng)一個(gè)函數(shù)的解決方法
這篇文章主要介紹了ON_COMMAND_RANGE多個(gè)按鈕響應(yīng)一個(gè)函數(shù)的解決方法,需要的朋友可以參考下2014-07-07
淺談C結(jié)構(gòu)和C++結(jié)構(gòu)之間的區(qū)別
這篇文章主要介紹了淺談C結(jié)構(gòu)和C++結(jié)構(gòu)之間的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
C++類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)示例
類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換是面向?qū)ο缶幊讨刑幚眍愋椭g轉(zhuǎn)換的兩種重要機(jī)制,本文就來(lái)介紹一下這兩種方法的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07

