指標使用小結

2022-09-24 01:09:09 字數 3635 閱讀 6843

結合示例 總結一下 指標的各個概念及指標變數在函式中的傳遞與應用

如 int a = 3;

int* point =&a;

設記憶體分布如下

address 變數名 值

0x300000 a 3

..

..

0x500000 point 0x300000

指標變數(用於儲存其他變數的空間位址)point (0x300000),指標變數的儲存位址(指標變數自身的位址)&point (0x500000),指標的指向儲存空間的值 *point ( 3)

示例:[cpp]

#include

#include

#include

typedef int* triplet;

void swap(int* a, int* b);

int initarray(int* arr, int a, int b, int c);

int inittriplet(triplet* t, int a, int b, int c);

int testpointassign(triplet t, int a, int b, int c);

int main()

; triplet t_num = null;

swap(&m, &n);

printf("m = %d, n = %d\n", m, n);

//為已分配空間(指標指向/陣列)賦值

initarray(array, 11, 12, 13);

printf("a[0] = %d, a[1] = %d, a[2] = %d\n", array[0], array[1], array[2]);

//指標變數t_num的值(指向的位址)與自身位址

printf("before test:t_num:%d, &t_num:%d\n", t_num, &t_num);

testpointassign(t_num, 111, 112, 113);

//指標變數t_num的值(指向的位址)與自身位址

printf("after test:t_num:%d, &t_num:%d\n", t_num, &t_num);

//指標指標指向新位址之前的位址 (此處 null--0000)

//printf("address before resign:%d\n",t_num);

//使指標指向新位址,在新位址處為其分配所指定大小的儲存空間

inittriplet(&t_num, 1, 2, 3);

//t_num儲存指標指向新位址之後的位址 (即連續3個儲存空間的首位址)

printf("after resign:t_num:%d, *t_num:%d, &t_num:%d\n", t_num, *t_num, &t_num);

printf("init point:t_num[0] = %d, t_num[1] = %d, t_num[2] = %d\n", t_num[0], t_num[1], t_num[2]);

return 0;

}

void swap(int* a, int* b)

int initarray(int* arr, int a, int b, int c)

int inittriplet(triplet* t, int a, int b, int c)

(*t)[0] = a;

(*t)[1] = b;

(*t)[2] = c;

return 0;

}

int testpointassign(triplet t, int a, int b, int c)

t[0] = a;

t[1] = b;

t[2] = c;

printf("in function 0~2: %d, %d, %d\n", t[0], t[1], t[2]);

printf("in function test address:%d\n",t);

return 0;

} 執行結果:

分析:int* p_num = null; //定義指標變數 p_num, 並初始化 使其 指向null(0000位址)

即p_numm 為其指向的位址(0x000000)

*p_num 為 指向位址所儲存值。 (0x000000 儲存資料不可訪問)

&p_num 為 指標變數p_num 自身所在的儲存空間。 (假設此處為 0x300000 )

p_num = (int*) malloc(sizeof(int) * 3);

p_num 指向乙個新的位址儲存空間 (假設為 0x500000)

*p_num 為 指向位址所儲存值。 (0x500000 中儲存的資料)

&p_num 為 指標變數p_num 自身所在的儲存空間。 (為 0x300000 與上述一致,保持不變。即指標變數p_num自身的儲存空間沒變,只是其所指向的儲存空間變了。 由原來指向的0x000000空間,變為由3個int構成的連續空間的首位址(低位位址)0x500000 對比

int inittriplet(triplet* t,int a,int b, int c);

int testpointassign(triplet t,int a,int b, int c);

前者傳遞的是指標變數t的指標(位址),後者傳遞的是指標變數

如同swap()函式的作用,如要在函式內 改變傳遞變數的值--將其帶回,需要傳遞變數的位址,在所在位址處修改變數的值;而非傳遞一變數。後者 將 實參 t_num 的值傳遞函式,函式內部 t_num 將值賦值給另一儲存空間(變數)t,修改的是變數t--test adress假設為 0x533245,而非變數t_num--須將t_num的位址傳遞到函式內部。

int initarray(int* arr,int a,int b, int c);

int array[3] = ;

int* point_t = null;

initarray(array, 1, 2, 3);//ok -- arr為一陣列名,有固定的儲存空間。在空間位址內賦值即可

initarray(point_t, 1, 2, 3);//error -- point_t為一指標,需為其所指向位址分配空間,才可賦值

指標與引用

c++中 可以用 引用 來實現下函式

[cpp]

int inittriplet(triplet* t, int a, int b, int c) //指標傳遞

(*t)[0] = a;

(*t)[1] = b;

(*t)[2] = c;

return 0;

} 呼叫 inittriplet(&t, 1, 2, 3);

[cpp]

int inittriplet(triplet& t, int a, int b, int c) //使用

t[0] = a;

t[1] = b;

t[2] = c;

return 0;

} 呼叫 inittriplet(t, 1, 2,3);

指標使用小結

1.簡單定義int a 100 int p p a pringf d p 2.指標與形參實參 p1 a p2 b temp p1 p1 p2 p2 temp p1,p2值變,a,b值也變。int p p p1 p1 p2 p2 p 此時僅指標指向變,a,b值不變。3.指標與陣列 p a 0 p的值是...

C 中指標使用小結

1 宣告指標 typename pointername 2 給指標賦值 對變數名用 運算子,來獲得被命名的記憶體的位址,new運算子返回未命名的記憶體的位址。3 對指標解除引用 對指標應用解除引用或間接運算子 來解除醫用 4 陣列名 陣列名被視為陣列第乙個元素的位址,但是陣列名為常量,不能修改它的值...

C語言指標使用小結

小結下自己對c語言的指標使用的理解。1,呼叫函式實現指標的申請與釋放。在開發中需要重複使用某個指標型別,為此專門寫了一組處理該型別的函式,最基礎就是該指標型別的申請與釋放。常見的錯誤是通過傳入乙個一級指標來實現指標的申請或釋放。測試用的資料型別 typedef struct mystruct mys...