c語言指標進階(三)
阿新 • • 發佈:2018-12-14
指標與記憶體四區理解的強化
1)主調函式 被調函式
主調函式可把堆區棧區全域性區的資料記憶體地址傳給被調函式
被調函式只能返回堆區 全域性資料
2)記憶體分配方式
指標做函式引數 是有輸入輸出特性的
輸入指的是 在主函式分配記憶體 在子函式修改
輸出指的是 在子函式分配記憶體 然後將修改後的指標扔出來 主函式定義一個指標去接
char *f(int num) { int ret = 0; char *tmp1; tmp = (char *)malloc(num); strcpy(tmp1 , "111222"); return tmp1; } void main() { char *p; int num = 100; p = f(num); }
利用函式封裝完成字串copy函式
#include<stdio.h> #include<stdlib.h> void copy_str(char *from,char *to) { for(;*from != '\0';from++,to++ ) { *to = *from; } *to = '\0'; return ; } int main() { char *from = "abcd"; char buf2[100]; copy_str(from,buf2); printf("buf2:%s\n",buf2); system("pause"); return 0; }
下面來看這個程式的記憶體四區圖
首先進行變數的傳遞
直到此時 to指向的位置需要手動賦值\0
* to ++ = * from ++;
如果寫成這個樣子應該怎樣去判斷 首先*與++的優先順序一樣
其實等價於
先執行*to = *from 再執行 from ++ , to++
如果使用while迴圈就不需要去加入\0
於是我們逐漸簡化了寫法 這些寫法都能達到要求
我們在呼叫函式時要注意以下錯誤
#include<stdio.h> #include<stdlib.h> void copy_str(char *from,char *to) { for(;*from != '\0';from++,to++ ) { *to = *from; } *to = '\0'; return ; } int main() { char *from = "abcd"; char *to = NULL; copy_str(from,to); system("pause"); return 0; }
記得去分配記憶體 此時是將字串copy進NULL這個受作業系統保護的位置
此時會發生宕機
我們在呼叫指標做形參的函式時不能改變形參指標的值 最好能用一個輔助指標將形參接入
因為我們在copy時最後會將指標落在\0再次列印from時無法列印