理解指針那些事

複習C/C++又到指針這裏,想起大一那時候第一次學C這個簡單的問題弄了好久都沒理解,也是笨

關於指針在我第一次學的時候覺得繞來繞去以至於就沒理解到就混了過去,網上很多文章講指針都能講錯 也是服了

 

 

 

 

最近很想說的話: 很多以前學過的基礎的東西還是有的模棱兩可,學了一次不叫會了,寫了博客也不叫會了,

得熟記於心能運用才叫會。

 

 

 

 

目錄:

  0x01 指針定義和使用

  0x02 常量指針、指針常量、指向常量的常量指針

  0x03 野指針、空指針、萬能指針

       0x04 數組指針與指針數組

  0x05 多級指針

 

 

0x01 指針定義和使用

指針:是一種數據類型 指針變量也是一種變量

指針格式: 對應的數據類型 * p:指針類型變量 用來指向一個變量的地址

int* p = &a;

通過指針修改變量的值

 *p = 200;

4、指針類型在內存中的大小 : 在32位操作系統中所有指針大小都是4個字節大小 64位是8個字節大小

  打印指針內存大小格式:

 sizeof(int *) || sizeof(p)

內存按照 unsignned int 爲每個一個內存分配編號

 

解釋:

①定義變量 int a =10;  數值10 存在內存 爲a開闢的空間中 a的地址爲0xff00 

②定義指針 int * p = &a  指針變量p 在內存中存貯的是 a的地址 0xff00,指針變量p 在內存中的大小在32位系統中都是4個字節大小

③*p = 200 通過操作指針變量p 所存儲的 a的地址 來改變a的值

④指針p 有一個自己的內存地址 指針p地址 與 定義變量a的地址 0xff00不同

 

 一個很好區別的概念

*前面的是對被指向對象的修飾*後面的是對指針本身的修飾

 

 

 

0x02 常量指針、指針常量、指向常量的常量指針

常量指針(被指向的對象是常量)

又叫常指針,可以理解爲常量的指針,指向的是個常量

int const* p; const int* p;

 

 

const修飾指針類型 int * 不能改變指針變量指向的內存地址的 但是可以改變指針指向的地址

#include<stdio.h>

int main()
{
    int qing = 100;
    int const* p = &qing;
    int qing2 = 200;
    printf("qing :%X\n", p);
    p = &qing2;
    printf("qing 2: %X", p);

}

 

 

 

 

 

 

指針常量(指針本身是常量)

本質是一個常量,而用指針修飾它。指針常量的值是指針,這個值因爲是常量,所以不能被賦值

int* const p;

const修飾指針變量    能改變指針指向地址的,但不能改變指針指向的地址

 

#include<stdio.h>

int main()
{
    int qing = 100;
    int* const p = &qing;
    *p = 200;
    printf("qing: %d", qing);

}

 

 

 

 

 

 

指向常量的常指針

指向常量的指針常量就是一個常量,且它指向的對象也是一個常量

const修飾指針類型修飾指針變量  不能改變指針指向的的值   也不能改變指針指向的地址 

const int* const p;

一個指針常量,指向的是一個指針對象;

它指向的指針對象且是一個常量,即它指向的對象不能變化;

 

 不過這裏還是可以通過原來的聲明修改變量a的值 : a++;

 

 

0x03 野指針、空指針、萬能指針

 

野指針:野指針是指向一個未知的內存空間,可能在讀寫的時候出現錯誤。

 0-255都是系統保留的 不可以讀,不可以寫

 

空指針 沒有指向任何的地址(其指向0的地址)

空制指針就是指向內存編號爲零的空間,操作該內存空間會報錯,一般情況空指針用於程序條件判斷

 

萬能指針:void *  指針可以指向任意變量的內存空間

 

 

 

 

0x04 數組指針與指針數組

數組名是數組的首地址,這是一個常量

 

 

 

 

 

數組指針

指向數組的指針 

int (*p)[n]

 格式

int arr [10] = { 0 } ;  

int * p = arr;

如要將二維數組賦給一指針
int a[3][4];
int (*p)[4]; //該語句是定義一個數組指針,指向含4個元素的一維數組。
 p=a;        //將該二維數組的首地址賦給p,也就是a[0]或&a[0][0]
 p++;       //該語句執行過後,也就是p=p+1;p跨過行a[0][]指向了行a[1][]

所以數組指針也稱指向一維數組的指針,亦稱行指針

 

當操作指針的時候 間接操作了數組 arr[i] = p[i];

指針的降級操作 ,取當前地址的值:p[5]、*p 

 

 

 

 

指針數組

指針數組,它是數組,數組的每個元素都是指針類型。

int *p[n]

存儲char *類型的地址數組

 char * arr[] ={"hello","world","niao","baobei"};

 

 

 

如要將二維數組賦給一指針數組:

int *p[3];
int a[3][4];
p++; //該語句表示p數組指向下一個數組元素。注:此數組每一個元素都是一個指針
for(i=0;i<3;i++)
p[i]=a[i]

這裏int *p[3] 表示一個一維數組內存放着三個指針變量,分別是p[0]、p[1]、p[2]

 

 

數組指針只是一個指針變量,指針數組是多個指針變量,以數組形式存在內存當中,佔有多個指針的存儲空間。

 

 

 

 

 

 

 

0x05 多級指針

 

多級指針就是指針的指針的指針

例如:

int **q;

int**q 可以把它分爲兩部分看,即 int* 和 (*q),後面 (*q) 中的“*”表示 q 是一個指針變量,前面的 int* 表示指針變量 q 只能存放 int* 型變量的地址。

對於二級指針甚至多級指針,我們都可以把它拆成兩部分。首先不管是多少級的指針變量,它都是一個指針變量,指針變量就是一個“*”,其餘的“*”表示的是這個指針變量只能存放什麼類型變量的地址。比如“int****a;”表示指針變量 a 只能存放 int*** 型變量的地址。

 

 

二級指針前面加** 代表指針指向一級指針指向地址的值,加*降維度

如果n級指針在前面加n個*就是指針指向一級指針指向地址的值

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章