一起來了解一下C++中的指針
1 指針的基本概念
作用:可以通過指針間接訪問內(nèi)存。
內(nèi)存編號(hào)是從0開始記錄的,一般用十六進(jìn)制數(shù)字表示??梢岳弥羔樧兞勘4娴刂?。
2 指針變量的定義和使用
指針變量定義語法:
數(shù)據(jù)類型* 變量名; &可以取地址;*可以取地址存放的值
示例:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
//1.指針定義的語法:數(shù)據(jù)類型 * 指針變量名;
int* p; //int* 定義一個(gè)指向整數(shù)型的指針變量
p = &a;
cout << "a的地址是:" << &a << endl;
cout << "指針p是:" << p << endl;
//2.使用指針,可以通過解引用的方式來找到指針指向的內(nèi)存
//指針變量前加* 代表解引用,就是找到一個(gè)地址內(nèi)存中存放的數(shù)據(jù)
*p = 100;
cout << "a = " << a << endl;
cout << "*p = " << *p << endl;
system("pause");
return 0;
}
3 指針?biāo)純?nèi)存空間
指針也是種數(shù)據(jù)類型,所以指針也是占內(nèi)存的
- 32位操作空間下,占用4個(gè)字節(jié)。
- 64位操作空間下,占用8個(gè)字節(jié)。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int* p = &a;
cout << "sizeof(int*)=" << sizeof(int*) << endl;
cout << "sizeof(float*)=" << sizeof(float*) << endl;
cout << "sizeof(double*)=" << sizeof(double*) << endl;
cout << "sizeof(char*)=" << sizeof(char*) << endl;
cout << "sizeof(string*)=" << sizeof(string*) << endl;
system("pause");
return 0;
}
可以改變上面的x86(32位)和x64(64位),查看輸出結(jié)果。

4 空指針和野指針
空指針:指針變量指向內(nèi)存中編號(hào)為0的空間
用途:初始化指針變量
注意:指針變量指向的內(nèi)存是不可以訪問的
示例:
#include<iostream>
using namespace std;
int main()
{
//1空指針用于給指針變量初始化.
int* p = NULL; //就是0
//空指針是不可以進(jìn)行訪問的
//0-255之間的內(nèi)存編號(hào)是系統(tǒng)占用的,因此不可以訪問
*p = 100;
//因?yàn)檫@里不可以訪問,所以程序直接退出了,后面的代碼不再執(zhí)行。
cout << p << *p << endl;
system("pause");
return 0;
}
野指針:指針變量指向非法的內(nèi)存空間
示例:
#include<iostream>
using namespace std;
int main()
{
//野指針
int* p = (int*)0x1100;
//這里定義的這個(gè)地址就是不屬于我們當(dāng)前地址空間的地址,就是越界了,也無法訪問,所以程序會(huì)自動(dòng)退出。
cout << *p << endl;
system("pause");
return 0;
}
5 const修飾指針
const修飾指針有三種情況:
1.常量指針:指向常量的指針
2.指針常量:指針類型的常量
3.指向常量的指針常量:一個(gè)是本身就是常量的指針指向了一個(gè)常量。
const int* p = &a; ---常量指針 特點(diǎn):指針的指向可以修改,但是指針指向的值不可以修改。 (幫助理解:從右向左看,const在最后起固定作用,固定了*p的值,但是沒有固定p的指向,即使改變了p的指向,*p也是不可更改的。) int* const p = &a; ---常量指針 特點(diǎn):指針的指向不可以修改,但是指針指向的值可以修改。 (幫助理解:從右向左看,const在p獲得地址后起固定作用,固定了p的指向,但是沒有固定*p的值) const int* const p = &a; 特點(diǎn):指針的指向和指針指向的值都不可以修改。
示例:
#include<iostream>
using namespace std;
int main()
{
int a = 10, b = 20;
//常量指針
const int* p = &a;
//*p = 10;錯(cuò)誤,指向的值不可修改
p = &b; //指向可以修改
//*p = 30;即使指向改變,指向的值也是不可修改的。
cout << *p << endl;
//指針常量
int* const p2 = &a;
//p2 = &b;錯(cuò)誤,指向不可修改
*p2 = 100;//指向的值可以修改
cout << *p2 << endl;
//指向常量的指針常量
const int* const p3 = &a;
//p3 = &b;錯(cuò)誤,指向不可修改
//*p3 = 100;錯(cuò)誤,指向的值不可修改
system("pause");
return 0;
}
6 指針和數(shù)組
作用:利用指針訪問數(shù)組中元素
示例:
#include<iostream>
using namespace std;
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "第一個(gè)元素為:" << arr[0] << endl;
int* p = arr;//首地址賦予了指針變量p
cout << p << endl;
cout << "利用指針訪問第一個(gè)元素:" << *p << endl;
p++;//指針+1是加一存儲(chǔ)單位,int型變量占4字節(jié),所以+4
cout << p << endl;
cout << "利用指針訪問第二個(gè)元素:" << *p << endl;
char brr[2] = { 'a','b' };
char* q = brr;
cout << (int)q << endl;
q++; //字符型變量占1個(gè)字節(jié),所以+1
cout << (int)q << endl;
//利用指針遍歷數(shù)組
p = arr;
for (int i = 0; i < 10; i++)
{
cout << *p << endl;
p++;
}
system("pause");
return 0;
}
7 指針和函數(shù)
作用:利用指針作函數(shù)參數(shù),可以修改實(shí)參的值。
對(duì)比值傳遞,值傳遞是為形參另開辟一段內(nèi)存進(jìn)行運(yùn)算;
而指針傳遞則是傳遞地址,通過對(duì)地址訪問,就可以直接對(duì)實(shí)參做出改變。
#include<iostream>
using namespace std;
void swap01(int a, int b) //值傳遞
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
void swap02(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10, b = 20;
swap01(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap02(&a, &b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
8 指針、數(shù)組、函數(shù)
案例:封裝一個(gè)函數(shù),利用冒泡排序,實(shí)現(xiàn)對(duì)整型數(shù)組的升序排序
例如數(shù)組,int arr[10]={4,3,6,9,1,2,10,8,7,5} ;
#include<iostream>
using namespace std;
void coutarr(int* arr,int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void bubbleSort(int* arr, int len) //值傳遞
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j + i < len - 1; j++)
{
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
int len = sizeof(arr) / sizeof(arr[0]);
cout << "排序前的數(shù)組為:" << endl;
coutarr(arr, len);
bubbleSort(arr, len);
cout << "排序后的數(shù)組為:" << endl;
coutarr(arr, len);
system("pause");
return 0;
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Qt基于QScrollArea實(shí)現(xiàn)界面嵌套移動(dòng)
在實(shí)際的應(yīng)用場(chǎng)景中,經(jīng)常會(huì)出現(xiàn)軟件界面戰(zhàn)場(chǎng)圖大于實(shí)際窗體大小。本文將利用QScrollArea可以為widget窗體添加滾動(dòng)條,實(shí)現(xiàn)界面嵌套移動(dòng),感興趣的可以了解一下2022-06-06
C語言數(shù)據(jù)結(jié)構(gòu)的時(shí)間復(fù)雜度和空間復(fù)雜度
算法在編寫成可執(zhí)行程序后,運(yùn)行時(shí)需要耗費(fèi)時(shí)間資源和空間(內(nèi)存)資源 。因此衡量一個(gè)算法的好壞,一般是從時(shí)間和空間兩個(gè)維度來衡量的,即時(shí)間復(fù)雜度和空間復(fù)雜度,感興趣的同學(xué)可以參考閱讀2023-04-04
C語言數(shù)據(jù)結(jié)構(gòu)之二叉樹的非遞歸后序遍歷算法
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之二叉樹的非遞歸后序遍歷算法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10
C++中調(diào)用復(fù)制(拷貝)函數(shù)的三種情況總結(jié)
這篇文章主要介紹了C++中調(diào)用復(fù)制(拷貝)函數(shù)的三種情況總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

