內存四區與指針的分析

數據類型:數據類型是固定內存大小的別名。

int a[10]={};

a的大小等於&a,但a+1的大小不等於&a+1,原因是數據類型不一樣

變量變量是內存空間的標號

內存四區

堆區,棧區,全局(靜態)和常量區,代碼區

全局(靜態)和常量區:如果兩個字符串完全一樣C++編譯器只會定義一份

Strcmp(p1,p2)相當於java中的equals

在被調用函數裏的臨時區分配內存主調用函數是不能用的

char * getString()//運行錯誤提醒返回局部或臨時變量

{

char buf[10];

strcpy(buf,"aasd");

return buf;

},返回已回收的內存空間地址

棧的開口向下,堆的開口向上,在棧區一次性分配buf[100] 地址是從下往上,因爲生長方向與內存存放方向是兩個不同概念

/對參數的指針類型應該怎麼理解

//理解角度需要從兩個角度出發

//站在c/c++編譯器的角度 對形參,如果是指針類型,c編譯器只會分配四個自己的內存。

////char *p7 形參 是變量

 

//指針的數據類型到底是什麼

指針的數據類型是指它所指向的內存空間的數據類型

指針的數據類型具有依fu特性

結論:指針的步長,根據所指內存空間類型來定。

char 型一次跳一個字節,int 型一次跳4個字節

 

void senddata01(char    *p1); void senddata01(char*            p1);

void senddata02(char **    p1); void senddata02(char *     *p1);  void senddata02(char         **p1);

void senddata03(char ***p1);

void senddata04(char *p[]); void senddata04(char *     p[]);  void senddata04(char *p    []);

void senddata05(char (*p)[10]); void senddata05(char (*p)             [10]);

void senddata05(char *****p4);

char *p ="sss";

*p = 'a';  //報錯,因爲sss在常量區不可以修改

在全局區Int a = 10 其中10是字面量,存放在不是堆棧,全局區的區域,不能取地址,可以理解爲代碼區之類的區域 

不可以通過函數出傳參改變指針變量的值(即指針的指向),但可以改變指針變量所指向的值

//因爲後綴++的優先級,高於,*p;

void copy_str4(char *from , char *to)

{

while((*to ++ = *from++) != '\0')

{

;

}

}

Char類型在實參賦值給形參的時候會隱式類型轉換爲int

int  copy_str2(char *from , char *to)

{

int ret = 0;

if (from ==NULL || to== NULL)

{

ret = -1;

printf("func copy_str2() err: %d, (from ==NULL || to== NULL)", ret);

return ret;

}

for (; *from!='\0'; from ++, to++ )

{

*to = *from;

}

*to = '\0';

return ret;

}

void main1()

{

int rv = 0;

char from[100] = {0};

char to[100] = {0};

strcpy(from, "fromabc");

rv = copy_str2(from, to);

if (rv != 0)

{

printf("func copy_str2:%d", rv);

return ;

}

 

printf("%s", to);

system("pause");

}

不同於

void main1()

{

int rv = 0;

char *from = {0};

char *to = {0}; //沒有分配內存

strcpy(from, "fromabc");

rv = copy_str2(from, to);

if (rv != 0)

{

printf("func copy_str2:%d", rv);

return ;

}

 

printf("%s", to);

system("pause");

}

切記:主調函數分配內存,被調函數使用,被調函數通過指針將結果甩出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章