3-1.c指針用作函數參數 目的:是為了通過swapdate()函數把實參x,y的值進行交換,上述例子是將形參dat_x,dat_y的值進行交換,但是形參的交換並沒有改變實參的交換,因為函數在調用時給形參分配了單獨的記憶體空間,實參的值傳遞給形參實際是把實參的值放在形參的記憶體空間,形參的值是實參的備份 ...
3-1.c指針用作函數參數
#include<stdio.h> typedef unsigned char uint8_t; //類型自定義,通過typedef語句重新把unsigned char命名為uint8_t,目的為了方便 extern void swapdata(uint8_t dat_x,uint8_t dat_y); int main(void) { uint8_t x,y; printf("請輸入x,y:"); scanf("%d,%d",&x,&y); printf("交換前:x=%d,y=%d\n",x,y); swapdata(x,y); printf("交換後:x=%d,y=%d\n",x,y); return 0; } void swapdata(uint8_t dat_x,uint8_t dat_y) { uint8_t temp; temp=dat_x; dat_x=dat_y; dat_y=temp; }
目的:是為了通過swapdate()函數把實參x,y的值進行交換,上述例子是將形參dat_x,dat_y的值進行交換,但是形參的交換並沒有改變實參的交換,因為函數在調用時給形參分配了單獨的記憶體空間,實參的值傳遞給形參實際是把實參的值放在形參的記憶體空間,形參的值是實參的備份,因此形參交換,實參並不會交換,不能達到交換實參的目的。
結果:
請輸入x,y:30,20 交換前:x=30,y=20 交換後:x=30,y=20
3-2 函數調用時,把指針作為函數參數進行傳遞,即傳遞變數的地址。在被調函數中,通過指針操作相應的變數,實際操作變數本身。在被調函數中對形參的操作實際就是對實參的操作。
#include <stdio.h> typedef unsigned char uint8_t; extern void swapdata(uint8_t *dat_x,uint8_t *dat_y); //函數參數變成指針 int main(void) { uint8_t x,y; uint8_t *p_x,*p_y; printf("請輸入x,y:"); scanf("%d,%d",&x,&y); p_x=&x; p_y=&y; printf("交換前:x=%d,y=%d\n",x,y); swapdata(p_x,p_y); printf("交換後:x=%d,y=%d\n",x,y); return 0; } void swapdata(uint8_t *dat_x,uint8_t *dat_y) //形參為兩個指針變數,目的是為了承接實參的值,實參是指針類型, { uint8_t temp; temp=*dat_x; //通過取值運算符*與指針變零dat_x結合,訪問實參x;調用swapdate()後,指針變數dat_x指向實參x,對*dat_x的操作實際是對實參x的操作。 *dat_x=*dat_y; *dat_y=temp; }
結果:
請輸入x,y:10,20 交換前:x=10,y=20 交換後:x=20,y=10
對比3-1和3-2的根本區別是:前者調用函數,實參是x,y的值;後者調用函數時,實參是x,y的指針,即二者的地址。
結論:要在被調函數中改變主調函數中的變數值,需要將主函數中變數的指針作為實參,傳遞給被調函數。
3-3指向結構體的指針變數作為函數參數
#include<stdio.h> #define BUF_LEN_MAX 3 //巨集定義定義buf的大小 #define DATA_LEN_MAX 3 //定義存放data欄位的buf大小 typedef unsigned char uint8_t; //給unisigned char 命名為uint8_t typedef struct { uint8_t head; uint8_t len; uint8_t add; uint8_t data[DATA_LEN_MAX]; uint8_t chk; }RF_FRAME; //定義結構體,用typedef語句把結構體重新命名為RF_FRAME,然後用該類型定義其他變數 RF_FRAME txbuf[BUF_LEN_MAX]={{0xAA,5,0x00,0x11,0x12,0x13,0x14}, //定義一個RF_FRAME類型的數組txbuf[]數組,併進行初始化;該數組的所有元素都是RF_FRAMR類型,包含head,len,add,data[],chk等成員 {0xAA,5,0x01,0x12,0x13,0x13,0x14}, {0xAA,5,0x02,0x13,0x14,0x13,0x14}}; void output(RF_FRAME *p_ptr); int main(void) { RF_FRAME *ptr_tmp; //定義RF_FRAME的指針變數ptr_tmp ptr_tmp=txbuf; //給指針變數ptr_tmp進行賦值,讓它指向txbuf。即ptr_tmp是指向結構體的指針變數 output(ptr_tmp); return 0; } void output(RF_FRAME *p_ptr) //傳遞實參ptr_tmp的值,因為是指針變數,實際是讓形參p_ptr指向實參ptr_tmp所指向的數據。也就是實參ptr_tmp和形參p_ptr同時指向數組bxbuf[] { uint8_t i,j; for(i=0;i<BUF_LEN_MAX;i++) { printf(" %x", p_ptr[i].head); //p_ptr指向數組txbuf[],所以p_ptr[i].head相當於txbuf[i].head printf(" %x", p_ptr[i].len); printf(" %x", p_ptr[i].add); for(j=0;j<DATA_LEN_MAX;j++) { printf(" %x", p_ptr[i].data[j]); } printf(" %x\n", p_ptr[i].chk); } }
結果:
aa 5 0 11 12 13 14 aa 5 1 12 13 13 14 aa 5 2 13 14 13 14