數據類型:數據類型是固定內存大小的別名。 |
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"); } 切記:主調函數分配內存,被調函數使用,被調函數通過指針將結果甩出 |
內存四區與指針的分析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.