指針與內(nèi)存, 指針數(shù)組,常量指針類筆記
指針與內(nèi)存, 指針數(shù)組,常量指針類筆記
?
1. char * str1;
//str1 只是一個指針,指針指向的空間還沒有分配,所以此時用strcpy向str1所指向的內(nèi)存
中拷貝內(nèi)容將出錯。利用malloc動態(tài)分配指向的內(nèi)存(在堆中):
str1=(char *)malloc(10) or str1=(char *)malloc(sizeof(char) * num)//分配num個char
所占有的字節(jié)(一般是1個字節(jié))數(shù)空間,用完后必須用free釋放內(nèi)存空間。這與在棧中自動分配的內(nèi)存不同,棧中的內(nèi)存在函數(shù)結(jié)束后自動釋放。
2.char str2[10];//字符數(shù)組的賦值
要么在聲明時初始化(="dfdf"or ={'a','b','c','d'},要么一個字符的賦值,str[0]= ;str[1]= ;......或者strcpy(str2,"aaaaaa")(因為內(nèi)存空間已分好);
如果char str2[10];str2="abcdefgjk";就會出錯,因為str2表示數(shù)組str2[10]的首地址,在聲明數(shù)組時已經(jīng)分配好了地址值,不是變量,而是常量。strcpy(str2,"aaaaaa")這種數(shù)組初始化方式,是將"aaaaaa"拷貝到以str2為開始地址的內(nèi)存空間當(dāng)中。
3。
????char *str1;
????char str2[10]="dfdf";
?????str1=str2;
//將指針str1指向以str2為首地址的內(nèi)存空間,即現(xiàn)在str2和str1表示內(nèi)存中的同一區(qū)域.
4。char *str3="aaaaaaaaaaaaaaa";
???char * str2="bbbb";
???strcpy(str3,str2);
//這時的str2和str3就不指向同一內(nèi)存空間,因為str3在初始化時已經(jīng)分配了指向的內(nèi)存空間;此時只是將str2所指向的內(nèi)存的內(nèi)容拷貝到str3所指向的內(nèi)存空間的內(nèi)容(注意:str3指向的內(nèi)存空間的大小最好大于str2所指向的內(nèi)存空間的大小,否則,可能將其他變量的內(nèi)存覆蓋。另外,c語言對數(shù)組不做越界檢查,使用時候小心,否則出現(xiàn)不可預(yù)料的錯誤)。
5。其它如int,double,float,short等類型,在申明變量時內(nèi)存空間就已經(jīng)分配好了。例如:
????int i=1;
????int j;
????j=i;
????j=2;
????printf("i=[%d];j=[%d]n",i,j);
輸出結(jié)果為i=1;j=2
?
6.圖例:
char*str1="abcd",*str2="cde";?//"abcd"的首地址為2000,"cde"的首地址為2004,分別存放在str1和str2.
???
????address(int類型)address(int類型)strings or object
????????------????????????????????????------
str1????|2000|???-----------------2000|????|:memory1
????------?????????????????????????...
str2????|2004|???-----------------2004|????|:memory2
????------?????????????????????????...
????????|????|????????????????????2007|????|
????------????????????????????????------
????????|????|????????????????????????|????|
????------????????????????????????------
(1)?????str1=str2;??????????//str1的值變?yōu)?004,指向了memory2
(2)????strcpy(str1,str2);//將memory2的內(nèi)容"cde"拷貝到memory1,str1仍指向memory1
kdsj