1. 程式人生 > >c語言指標進階(三)

c語言指標進階(三)

指標與記憶體四區理解的強化

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時無法列印