結合示例 總結一下 指標的各個概念及指標變數在函式中的傳遞與應用
如 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 ...