日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言sizeof與字符串處理與動態內存分配及main函數參數詳解_C 語言

作者:ChampLixxx ? 更新時間: 2022-09-02 編程語言

常用的字符串處理函數(標準庫里面的)

strlen : 用來求一個字符串的長度

?? ??? ??? ??? ??? ? ?#include <string.h>
?? ??? ??? ??? ??? ? size_t strlen(const char *s);
?? ??? ??? ??? ?@s : 指向要計算的那個字符串的首地址?
?? ??? ??? ??? ??? ?“const char *” : 表示在函數調用過程中,防止對s指向的空間里面內容進行修改。
?? ??? ??? ??? ??? ?“size_t”: size_t => unsigned int ?
?? ??? ??? ??? ??? ??? ??? ? ?typede unsigned int size_t ?;?

返回值: 返回字符串s第一個\0前面的字符的個數。

atoi:將十進制的數字字符串,轉成整數值

                 #include <stdlib.h>
               int atoi(const char *nptr);
               long atol(const char *nptr);
               long long atoll(const char *nptr); 

strcpy/strncpy :字符串拷貝函數 將一個字符串拷貝到另外一個字符串上面去。

?? ??? ??? ??? ? #include <string.h>
?? ??? ??? ??? ?strcpy :用來把src指向的字符串,拷貝到dest指向的空間中去,直到遇到\0才會結束。
?? ??? ??? ? ? char *strcpy(char *dest, const char *src);
?? ??? ??? ??? ?@dest : ?destination 目的地 ,必須是一個可寫的空間
?? ??? ??? ??? ?@src : source 源,從哪里 ?
?? ??? ??? ??? ?返回值: 返回拷貝后目的地字符串的首地址?

strncpy : 正是為了解決strcpy的這個bug的(strcpy沒有考慮到dest指向的空間的大小問題)

?? ??? ??? ??? ??? ?#include <string.h>
?? ??? ??? ??? ??? ? char *strncpy(char *dest, const char *src, size_t n);
?? ??? ??? ??? ??? ?strncpy: 把src指向的字符串前面頂多n個字符拷貝到dest指向的內存空間中去。
?? ??? ??? ??? ??? ??? ?它到底拷貝了多少個字符呢??
?? ??? ??? ??? ??? ??? ??? ?<= n?

?? ??? ??? ??? ??? ??? ?(1) 遇到\0拷貝結束,此時\0也會被拷貝。
?? ??? ??? ??? ??? ??? ??? ?char s[10];?
?? ??? ??? ??? ??? ??? ??? ?strncpy(s, "12345", 10);?? ?
?? ??? ??? ??? ??? ??? ?(2) 已經拷貝了n個字符,此時后面的字符就不會被拷貝。?
?? ??? ??? ??? ??? ??? ??? ?char s[10];?
?? ??? ??? ??? ??? ??? ??? ?strncpy(s, "0123456789", 10);?

strcmp / strncmp :一個一個字符進行比較它們對應的ASCII碼

?? ??? ??? ??? ?if c1 > c2?
?? ??? ??? ??? ??? ?返回1?
?? ??? ??? ??? ?if c1 < c2?
?? ??? ??? ??? ??? ?返回-1?
?? ??? ??? ??? ?if c1 == c2?
?? ??? ??? ??? ??? ?則繼續比較下一個字符,如果全部相等則返回0?

				   #include <string.h>
				   int strcmp(const char *s1, const char *s2);
				   int strncmp(const char *s1, const char *s2, size_t n);

strcat / strncat 字符串連接函數

?? ??? ??? ? #include <string.h>
?? ??? ??? ?strcat : 用來把src指向的字符串拷貝到dest指向的字符串的末尾(尾部連接)
?? ??? ??? ? char *strcat(char *dest, const char *src);
?? ??? ??? ?@dest : 指向目標字符串(一段可寫的空間)?
?? ??? ??? ??? ?@src : 指向原始字符串?
?? ??? ??? ??? ?返回值: ?
?? ??? ??? ??? ??? ?返回連接后的字符串的首地址(dest指向的首字符地址)

?? ??? ? char *strncat(char *dest, const char *src, size_t n);
?? ??? ??? ?strncat : 把src指向的字符串拷貝到dest末尾,但是它頂多拷貝了n個字符。
?? ??? ??? ??? ?(1) 遇到\0拷貝結束,此時\0也會被拷貝。?
?? ??? ??? ??? ?(2) 即使沒有遇到\0,但是已經拷貝了n個字符啦。?

sizeof 求字節運算符

sizeof(x) : 用來求一個對象或類型所占字節數的運算符,x可以是一個對象(變量、指針、數組、==),也可以是一個類型。

先求x的類型,然后再求該類型所占的字節數

=> typeof(x)

=> sizeof( typeof(x) )

sizeof(指針類型) == 機器字長

32bits的機器 指針所占字節數為4

64bits的機器 指針所占字節數為8

求數組的大小

		int a[100];
		sieof(a[0]) == 4 
		sizeof(a[1024]) ==  4  
		sizeof(a) == 
			typeof(a) => int[100]
			sizeof(int[100]) => 4 * 100 
		char *  p[4]; //指針數組
		sizeof(p[0]) ==  8 
		sizeof(p) == 
			typeof(p) => char* [4] 
			sizeof(char *) * 4 == 8 * 4 
		char (*p)[4];//數組指針
		sizeof(p)  ==  8 
	int (*p)(int ,int); //函數指針
		sizeof(p) ==  8 

動態內存分配函數

malloc : 用來動態分配一個size大小的內存空間,并且把分配到內存空間的首地址返回。

malloc分配的空間的生存期,是隨進程持續性。

malloc分配的空間一旦分配給你,他就不會自動去釋放,一定需要你調用free或你的這個進行消亡了!

?? ??? ?#include <stdlib.h>
?? ??? ?void *malloc(size_t size);
?? ??? ??? ??? ?@size : 要分配的空間的大小(以字節為單位)
?? ??? ??? ??? ?返回值: ?
?? ??? ??? ??? ??? ?成功返回分配的空間的首地址
?? ??? ??? ??? ??? ?失敗返回NULL.?
?? ??? ?char * p = (char *)malloc(100);?

free : 用來釋放ptr指向的內存空間的

ptr指向的內存空間,必須是malloc/realloc/calloc這三個函數分配的內存空間。

?? ??? ??? ??? ?void free(void *ptr);
?? ??? ??? ??? ?@ptr : 指向咱們需要釋放的那一塊內存的首地址
?? ??? ??? ??? ??? ?一般為malloc/realloc/calloc這三個函數的
?? ??? ??? ??? ??? ?返回值。?

calloc : 它的作用類似于 malloc ,不過它是數組分配函數, 它分配一個數組空間,它帶有兩個參數。

?? ??? ??? ? void *calloc(size_t nmemb, size_t size);
?? ??? ??? ??? ?@nmemb : ?表示分配多少元素?
?? ??? ??? ??? ?@size : ?表示每一個元素占多少字節
?? ??? ??? ??? ?返回值:?
?? ??? ??? ??? ??? ?成功返回分配的空間的首地址。
?? ??? ??? ??? ??? ?失敗返回NULL。

int * a = calloc(10, sizeof(int)); 

realloc : 用來把ptr(必須是malloc/realloc/calloc這三個函數分配的內存空間)指向的動態內存,擴展到size大小。

?? ??? ??? ??? ?void *realloc(void *ptr, size_t size);
?? ??? ??? ??? ?@ptr : 指向咱們需要擴展的那一塊內存的首地址。
?? ??? ??? ??? ??? ?一般為malloc/realloc/calloc這三個函數的返回值。
?? ??? ??? ??? ?@size : 擴展到size大小
?? ??? ??? ??? ?返回值:?
?? ??? ??? ??? ??? ?成功返回分配的空間的首地址
?? ??? ??? ??? ??? ?失敗返回NULL。

?? ??? ??? ??? ?1. size > 原來的大小?
?? ??? ??? ??? ??? ?realloc用來把ptr指向的內存,擴展到size字節,
?? ??? ??? ??? ??? ?原來前面的內存保持不變,后面新增內存內容不會
?? ??? ??? ??? ??? ?被初始化。
?? ??? ??? ??? ??? ?(1) 原址擴建
?? ??? ??? ??? ??? ?(2) 整體搬遷?
?? ??? ??? ??? ??? ?2. size == ?0?
?? ??? ??? ??? ??? ? realloc(ptr, 0) <=> free(ptr)

main的參數問題

在linux下面,程序運行的時候,可以帶參數,只不過所有的參數都當作是字符串來處理的。

			//argc :保存你給main傳參的個數
			//argv : 用來保存傳遞給main的所有參數的
			//int main(int argc, char * argv[])
			int main(int argc, char ** argv)
			{
			}

原文鏈接:https://blog.csdn.net/weixin_46836491/article/details/125702768

欄目分類
最近更新