深入理解c語言指標 第五章

2021-08-13 15:25:56 字數 3360 閱讀 5810

字串是以ascii字元nul結尾的字串行。ascii字元nul表示

為\0。

c中有兩種型別的字串。

單位元組字串(由char資料型別組成的序列)

寬字串(由wchar_t資料型別組成的序列)

wchar_t資料型別用來表示寬字元,要麼是16位寬,要麼是32位寬。

這兩種字串都以nul結尾。

警告 記住,null和nul不同。null用來表示特殊的指標,通常定義為((void*)0),而nul是乙個char,定義為\0,兩者不能混用。

警告

試圖用字元字面量來初始化char指標不會起作用。因為字

符字面量是int型別,這其實是嘗試把整數賦給字元指標。這樣經

常會造成應用程式在解引指標時終止:

char* prefix = '+'; // 不合法

正確的做法是像下面這樣用malloc函式:

prefix = (char*)malloc(2);

*prefix = '+';

*(prefix+1) = 0;

---------------------------

char *command;

printf("enter a command: ");

scanf("%s",command);//在使用的時候,再次之前沒有為其分配記憶體

下面這段**的字串記憶體情況

分配在全域性記憶體的字串會一直存在,也可以被多個函式訪問;

靜態字串也一直存在,不過只有定義它們的函式才能訪問

分配在堆上的內存在釋放之前會一直存在,也可以被多個函式訪問。

//字串第比較 

char *p = "aaaa";

char *pp = "aaaa";

char *ppp = "bbbb";

printf("%d\n",strcmp(p,pp));p與pp相等

printf("%d\n",strcmp(p,ppp));p比ppp小

printf("%d\n",strcmp(ppp,p));ppp比p大

//strcpy字串的複製

char t="tt";

char tt="tsts";

strcpy(t,tt);//賦值陣列,將tt中內容複製到t中,為什麼用指標就不行

printf("%s\n",t);

char *ttt = "ttttttttttttttttt";

strcpy(tt,ttt);

printf("%s\n",tt);

/*strcpy的引數:

陣列,陣列

陣列,指標

但卻不能是:指標,陣列!!!!!!!!

//字串的複製注意字串的長度,是否越界

*/printf("字串的拼接\n");

/字串的拼接strcat

char c = "ccc" ;

char cc="aaa";

strcat(c,cc);

printf("這裡雖然列印出來了,但是有下面的迴圈可以知道陣列越界了, %s\n",c);

int i=0;

for(;i

}字串的拼接最好建立第三個字串,長度是要複製兩個字串的和,注意前乙個字串的\0

char* cd = "cd";

char* se = "se";

char* ccc = (char*)malloc(strlen(cd)+strlen(se)+1);

strcpy(ccc,cd);

strcat(ccc,se);

printf("%s",ccc);

//在拼接的過程當中,需要注意的是與字面量的拼接

char *p = (char*)malloc(2);

p = strcat(p,"\\");//因為\為轉移符號,所以上面只是乙個符號,但去有乙個\0需要注意

字串的返回

在函式內部通過malloc建立的字元陣列,呼叫者在適當的時候free掉

char* blanks(int number) s

paces[number] = '\0';

return spaces;

}.....

char *tmp = blanks(5);//要記得在適當的時候釋放掉tmp

int compareignorecase(const

char* s1, const

char* s2)

通過這個案例我們知道並不是只有通過malloc建立的字串需要手動的釋放記憶體,什麼樣的東西需要手動釋放記憶體,需要自己下面強化了解

問題:

字串字面量和字面量池

記憶體的釋放

乙個簡單的排序,函式名當做引數

#include 

#include

暫時不知道這個是什麼意思,但是類似給函式去乙個別名

typedef

int (fptroperation)(const

char*, const

char*);

void displaynames(char* names, int size)

printf("\n");

}/fptroperation operation 用於接受乙個函式名的引數

void sort(char *array, int size, fptroperation operation) }}

}int compare(const

char* s1, const

char* s2)

/* 實現測試**

*/int main(int argc, char *argv) ;

sort(names,5,compare);//把函式名當做乙個引數來傳遞

displaynames(names,5);

printf("\n\n%d\n",compare);

}

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

C語言指標深入理解

前幾天看了乙個程式,裡面一段關於指標的 讓我非常糾結,看了很久才看懂,在這裡將將其記錄下來,希望能對大家有一定的幫助,先看示例程式 編譯器gcc include include include typedef struct list node list node,list,plist node st...