手把手帶你搞懂C語言指針
前言
自學(xué)筆記,沒有歷史知識(shí)鋪墊(省略百度部分),C語言指針的使用
一、概念
1.*指針
指針: 內(nèi)存資源的地址指針
變量:存放指針的盒子 32位操作系統(tǒng)中,其大小位32bit,即4個(gè)字節(jié),64位為64bit,即8個(gè)字節(jié),與指針數(shù)據(jù)類型無關(guān)
指針的數(shù)據(jù)類型: 表示指針要讀取的地址字節(jié)數(shù),如:char *p;讀取1個(gè)字節(jié),int *p讀取4個(gè)字節(jié),具體選擇根據(jù)指向的變量調(diào)整
指針指向的內(nèi)存空間一定要合法(存在,且有讀的權(quán)限)
int main()
{
int *p1;
char *p2;
//p1:4,p2:1
printf("p1:%lu,p2:%lu \n",sizeof(*p1),sizeof(*p2));
return 0;
}
指針變量的寫法:*p_xx
指針變量通常以*p_開頭,是英文指針Pointer的首字母
2.&取址
&a 變量a的內(nèi)存地址
int main()
{
int a = 12312312;
int *p1;
p1 = &a;
//*p1指針指向變量的值:12312312,p1指向的內(nèi)存地址E9C4AE18(等價(jià)于&a)
printf("*p1:%d,p1指向的內(nèi)存地址%X",*p1,p1);
return 0;
}
二、指針修飾符
1.const 常量指針
const char *p;從右往左理解: *p指針 char指向1個(gè)字節(jié)的內(nèi)容 const該字節(jié)內(nèi)容為只讀 場景:描述字符串
char *const p;從右往左理解:*p指針 const指針方向?yàn)橹蛔x(無法切換) char指向的內(nèi)容是1字節(jié),內(nèi)容允許修改 場景:硬件資源
const char *const p;結(jié)合了上面1和2的限制,指針方向?yàn)橹蛔x,指向的內(nèi)容為只讀 場景:ROM設(shè)備
//以下兩個(gè)寫法的作用是一樣的 const char *p; char const *p; //以下兩個(gè)寫法的作用是一樣的 char *const p; char *p const;
2.volatile 特征指針
volatile char *p;防止優(yōu)化指向內(nèi)存地址(阻止指令重排)
3.typedef 別名指針
為指針起別名,復(fù)雜的指針場景使用,提高代碼可讀性
typedef char *xx_p
三、指針運(yùn)算
1. ++ -- + -
指針的運(yùn)算都是指向地址的運(yùn)算,最小單位為當(dāng)前指針變量的數(shù)據(jù)類型所占的內(nèi)存大小
如:p+1的效果為0x20+1*(sizeof(p))
2.[] 標(biāo)簽訪問
指針指向的內(nèi)存位置,標(biāo)簽?zāi)J(rèn)為0,及:p[0]
標(biāo)簽訪問一般用于非線性訪問,如:訪問當(dāng)前指針指向內(nèi)存位置的后邊第二個(gè)位置p[2]效果為*(p+2)
使用標(biāo)簽訪問,則取出的是標(biāo)簽內(nèi)存里的值,而不是地址
C語言的標(biāo)簽化默認(rèn)是允許越界的,甚至用標(biāo)簽掃描整個(gè)內(nèi)存,修改不同應(yīng)用的屬性
int main()
{
int a = 0x123;
int a1 = 0x134;
int a2 = 0x145;
int *p;
p = &a1;
//*p:134 ,*(p-1):145 ,p[-1]:145,p[1]:123
printf("*p:%X ,*(p-1):%X ,p[-1]:%X,p[1]:%X \n",*p,*(p-1),p[-1],p[1]);
return 0;
}
四、指針邏輯操作
>= == <= != 指針可以做邏輯操作,比較大小,但實(shí)際運(yùn)用的比較少
p1 > p2 指針?biāo)嫉牡刂繁容^,意義不大
p1 == n 一般跟一個(gè)特殊值比較,比如p1 == 0x0,地址的無效值,結(jié)束標(biāo)識(shí),表示p1處理完了
*p1 > *p2 實(shí)際上是指向變量值的比較
注意:
指針必須是同類型比較才有意義
總結(jié)
本章主要為C語言指針
Segmentation fault 段錯(cuò)誤異常,通常是指針指向問題引起
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
如何實(shí)現(xiàn)在C++中調(diào)用C函數(shù)
這篇文章主要介紹了如何實(shí)現(xiàn)在C++中調(diào)用C函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
詳解C++?functional庫中的仿函數(shù)使用方法
仿函數(shù)(functor)又稱之為函數(shù)對(duì)象(function?object),實(shí)際上就是?重載了()操作符?的?struct或class。本文將詳細(xì)講解C++中仿函數(shù)的使用方法,需要的可以參考一下2022-04-04
C++實(shí)現(xiàn)strcmp字符串比較的深入探討
本篇文章是對(duì)使用C++實(shí)現(xiàn)strcmp字符串比較進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語言實(shí)現(xiàn)掃雷小游戲(擴(kuò)展版可選擇游戲難度)
游戲目標(biāo)是找出所有沒有地雷的方格,完成游戲;要是按了有地雷的方格,游戲失??;玩家可標(biāo)記雷的位置,游戲以完成時(shí)間來評(píng)高低,并且用戶可以選擇游戲難度2019-10-10
C語言類型轉(zhuǎn)換與常量的細(xì)節(jié)深入理解探究
這篇文章主要為大家介紹了C?語言類型轉(zhuǎn)換與常量的細(xì)節(jié)深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

