指標使用小結 指標傳遞與指標所指空間賦值

2021-06-19 00:44:38 字數 3881 閱讀 4066

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

如 int a = 3; 

int* point =&a;

設記憶體分布如下

address

變數名值

0x300000a3

....

0x500000

point

0x300000

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

示例:

#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

對比intinittriplet(triplet

* t,

inta,

intb,

intc);

inttestpointassign(triplet t,

inta,

intb,

intc);

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

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

intinitarray(

int

* arr,

inta,

intb,

intc);

int array[3] = ;

int* point_t = null;

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

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

指標與引用

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

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);

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);

指標的值 指標的指標 指標所指變數

在c語言中,指標是乙個很重要的組成部分,其本質為某一段記憶體的起始位址。以如下 進行舉例說明 int a 定義乙個變數a int p 定義乙個指標p int q p a 將a的位址賦值給p,其型別為int q p 將指標q的位址賦值給q,其型別為int p a p代表指標p所指向的變數a,其型別為i...

指標傳遞問題小結

include include include void fun char p intmain void 執行結果中並未輸出字串hello其實這裡主函式呼叫fun函式,形參向實參傳遞引數的時候,發生的是拷貝。在fun函式中對區域性指標變數p的任何修改都不會影響到主函式中的指標變數p。值傳遞,形參的修...

傳遞指標和傳遞指標的指標

總是不懂指標 看了乙個csdn的問題 豁然開朗 在寫乙個棧的東西,在銷毀的時候有點小問題 define position int define size t int define elemtype char define buttom 1 struct ststack typedef struct ...