字符串、字符串數組、與一級指針
阿新 • • 發佈:2018-08-04
\n ++ nbsp 並且 習慣 clas 大於 i++ code
//一級指針的典型用法
//數組 int a[10]
//字符串
//1 C語言的字符串 以零結尾的字符串
//2 在C語言中沒有字符串類型 通過字符數組 來模擬字符串
//3 字符串的內存分配 堆上 棧上 全局區 (很重要)
字符串的初始化
void main() { //1 指定長度 char buf2[100] = {‘a‘, ‘b‘, ‘c‘, ‘d‘}; //1-1 char buf3[2] = {‘a‘, ‘b‘, ‘c‘, ‘d‘}; //如果初始化的個數大於內存的個數 編譯錯誤 //1-2 //後面的buf2[4]-buf2[99] 0 //2 不指定長度 C編譯器會自動幫程序員 求元素的個數char buf1[] = {‘a‘, ‘b‘, ‘c‘, ‘d‘}; //buf1是一個數組 不是一個以0結尾的字符串 printf("buf2: %s \n", buf2); printf("buf2[88]:%d \n", buf2[88]); printf("hello....\n"); system("pause"); return ; }
//下面要是面試題可別錯 //用字符串 來 初始化字符數組 //strlen() 長度 不包括0 //sizeof() 內存塊的大小 void main52() { int size = 0;char buf3[] = "abcd"; // buf3 作為字符數組 應該是5個字節 //作為字符串 應該4個字節 int len = strlen(buf3); printf("buf3字符的長度:%d \n", len); //4 //buf3 作為數組 數組是一種數據類型 本質(固定小大內存塊的別名) size = sizeof(buf3); // printf("buf3數組所占內存空間大小:%d \n", size); //5 printf("hello....\n"); { char buf4[128] = "abcd"; //buf printf("buf4[100]:%d \n", buf4[100]); } system("pause"); return ; }
//通過數組下標 和 指針
void main58() { int i = 0; char *p = NULL; char buf5[128] = "abcdefg"; // buf for (i=0; i<strlen(buf5); i++) { printf("%c ", buf5[i]); } p = buf5; //buf 代表數組首元素的地址 for (i=0; i<strlen(buf5); i++) { p = p +i; //*(p+i) printf("%c ", *p ) ; } //buf for (i=0; i<strlen(buf5); i++) { printf("%c ", *(buf5+i) ) ; } //[] *的推導過程 // buf5[i] ===> buf5[0+i]; ==> *(buf5+i); { //buf5 = buf5 + 1; //buf5 = 0x11; } printf("hello....\n"); system("pause"); } // []的本質 :和*p 是一樣 ,只不過是符合程序員的閱讀習慣 // buf5 是一個指針, 只讀的常量 buf5是一個常量指針 析構內存的時候,保證buf所指向的內存空間安全釋放 //為什麽這麽做? //p普通指針和內存首地址區別
//一級指針的內存模型 void main61() { char buf[20]= "aaaa"; //定義並且初始化 char buf2[] = "bbbb"; char *p1 = "111111"; char *p2 = malloc(100); strcpy(p2, "3333"); system("pause"); return ; }
//字符串技術推演 void copy_str(char *from, char *to) { for (; *from != ‘\0‘; from++, to++) { *to = *from; } *to = ‘\0‘; return ; } void main() { char *from = "abcd"; char buf[100]; copy_str(from, buf); printf("buff:%s\n", buf); system("pause"); }
字符串、字符串數組、與一級指針