C語(yǔ)言sizeof與字符串處理與動(dòng)態(tài)內(nèi)存分配及main函數(shù)參數(shù)詳解
常用的字符串處理函數(shù)(標(biāo)準(zhǔn)庫(kù)里面的)
strlen : 用來(lái)求一個(gè)字符串的長(zhǎng)度
#include <string.h>
size_t strlen(const char *s);
@s : 指向要計(jì)算的那個(gè)字符串的首地址
“const char *” : 表示在函數(shù)調(diào)用過(guò)程中,防止對(duì)s指向的空間里面內(nèi)容進(jìn)行修改。
“size_t”: size_t => unsigned int
typede unsigned int size_t ;
返回值: 返回字符串s第一個(gè)\0前面的字符的個(gè)數(shù)。
atoi:將十進(jìn)制的數(shù)字字符串,轉(zhuǎn)成整數(shù)值
#include <stdlib.h> int atoi(const char *nptr); long atol(const char *nptr); long long atoll(const char *nptr);
strcpy/strncpy :字符串拷貝函數(shù) 將一個(gè)字符串拷貝到另外一個(gè)字符串上面去。
#include <string.h>
strcpy :用來(lái)把src指向的字符串,拷貝到dest指向的空間中去,直到遇到\0才會(huì)結(jié)束。
char *strcpy(char *dest, const char *src);
@dest : destination 目的地 ,必須是一個(gè)可寫的空間
@src : source 源,從哪里
返回值: 返回拷貝后目的地字符串的首地址
strncpy : 正是為了解決strcpy的這個(gè)bug的(strcpy沒(méi)有考慮到dest指向的空間的大小問(wèn)題)
#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
strncpy: 把src指向的字符串前面頂多n個(gè)字符拷貝到dest指向的內(nèi)存空間中去。
它到底拷貝了多少個(gè)字符呢?
<= n(1) 遇到\0拷貝結(jié)束,此時(shí)\0也會(huì)被拷貝。
char s[10];
strncpy(s, "12345", 10);
(2) 已經(jīng)拷貝了n個(gè)字符,此時(shí)后面的字符就不會(huì)被拷貝。
char s[10];
strncpy(s, "0123456789", 10);
strcmp / strncmp :一個(gè)一個(gè)字符進(jìn)行比較它們對(duì)應(yīng)的ASCII碼
if c1 > c2
返回1
if c1 < c2
返回-1
if c1 == c2
則繼續(xù)比較下一個(gè)字符,如果全部相等則返回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 字符串連接函數(shù)
#include <string.h>
strcat : 用來(lái)把src指向的字符串拷貝到dest指向的字符串的末尾(尾部連接)
char *strcat(char *dest, const char *src);
@dest : 指向目標(biāo)字符串(一段可寫的空間)
@src : 指向原始字符串
返回值:
返回連接后的字符串的首地址(dest指向的首字符地址)
char *strncat(char *dest, const char *src, size_t n);
strncat : 把src指向的字符串拷貝到dest末尾,但是它頂多拷貝了n個(gè)字符。
(1) 遇到\0拷貝結(jié)束,此時(shí)\0也會(huì)被拷貝。
(2) 即使沒(méi)有遇到\0,但是已經(jīng)拷貝了n個(gè)字符啦。
sizeof 求字節(jié)運(yùn)算符
sizeof(x) : 用來(lái)求一個(gè)對(duì)象或類型所占字節(jié)數(shù)的運(yùn)算符,x可以是一個(gè)對(duì)象(變量、指針、數(shù)組、==),也可以是一個(gè)類型。
先求x的類型,然后再求該類型所占的字節(jié)數(shù)
=> typeof(x)
=> sizeof( typeof(x) )
sizeof(指針類型) == 機(jī)器字長(zhǎng)
32bits的機(jī)器 指針?biāo)甲止?jié)數(shù)為4
64bits的機(jī)器 指針?biāo)甲止?jié)數(shù)為8
求數(shù)組的大小
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]; //指針數(shù)組 sizeof(p[0]) == 8 sizeof(p) == typeof(p) => char* [4] sizeof(char *) * 4 == 8 * 4
char (*p)[4];//數(shù)組指針 sizeof(p) == 8
int (*p)(int ,int); //函數(shù)指針 sizeof(p) == 8
動(dòng)態(tài)內(nèi)存分配函數(shù)
malloc : 用來(lái)動(dòng)態(tài)分配一個(gè)size大小的內(nèi)存空間,并且把分配到內(nèi)存空間的首地址返回。
malloc分配的空間的生存期,是隨進(jìn)程持續(xù)性。
malloc分配的空間一旦分配給你,他就不會(huì)自動(dòng)去釋放,一定需要你調(diào)用free或你的這個(gè)進(jìn)行消亡了!
#include <stdlib.h>
void *malloc(size_t size);
@size : 要分配的空間的大小(以字節(jié)為單位)
返回值:
成功返回分配的空間的首地址
失敗返回NULL.
char * p = (char *)malloc(100);
free : 用來(lái)釋放ptr指向的內(nèi)存空間的
ptr指向的內(nèi)存空間,必須是malloc/realloc/calloc這三個(gè)函數(shù)分配的內(nèi)存空間。
void free(void *ptr);
@ptr : 指向咱們需要釋放的那一塊內(nèi)存的首地址
一般為malloc/realloc/calloc這三個(gè)函數(shù)的
返回值。
calloc : 它的作用類似于 malloc ,不過(guò)它是數(shù)組分配函數(shù), 它分配一個(gè)數(shù)組空間,它帶有兩個(gè)參數(shù)。
void *calloc(size_t nmemb, size_t size);
@nmemb : 表示分配多少元素
@size : 表示每一個(gè)元素占多少字節(jié)
返回值:
成功返回分配的空間的首地址。
失敗返回NULL。
int * a = calloc(10, sizeof(int));
realloc : 用來(lái)把ptr(必須是malloc/realloc/calloc這三個(gè)函數(shù)分配的內(nèi)存空間)指向的動(dòng)態(tài)內(nèi)存,擴(kuò)展到size大小。
void *realloc(void *ptr, size_t size);
@ptr : 指向咱們需要擴(kuò)展的那一塊內(nèi)存的首地址。
一般為malloc/realloc/calloc這三個(gè)函數(shù)的返回值。
@size : 擴(kuò)展到size大小
返回值:
成功返回分配的空間的首地址
失敗返回NULL。1. size > 原來(lái)的大小
realloc用來(lái)把ptr指向的內(nèi)存,擴(kuò)展到size字節(jié),
原來(lái)前面的內(nèi)存保持不變,后面新增內(nèi)存內(nèi)容不會(huì)
被初始化。
(1) 原址擴(kuò)建
(2) 整體搬遷
2. size == 0
realloc(ptr, 0) <=> free(ptr)
main的參數(shù)問(wèn)題
在linux下面,程序運(yùn)行的時(shí)候,可以帶參數(shù),只不過(guò)所有的參數(shù)都當(dāng)作是字符串來(lái)處理的。
//argc :保存你給main傳參的個(gè)數(shù) //argv : 用來(lái)保存?zhèn)鬟f給main的所有參數(shù)的 //int main(int argc, char * argv[]) int main(int argc, char ** argv) { }
到此這篇關(guān)于C語(yǔ)言sizeof與字符串處理與動(dòng)態(tài)內(nèi)存分配及main函數(shù)參數(shù)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言sizeof內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)學(xué)生考勤信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生考勤信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C語(yǔ)言實(shí)現(xiàn)維吉尼亞密碼的示例代碼
維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬于多表密碼的一種簡(jiǎn)單形式。本文將用C語(yǔ)言實(shí)現(xiàn)維吉尼亞密碼,需要的可以參考一下2022-11-11C++實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Win11+?VS2022編譯?FFmpeg6.0?靜態(tài)庫(kù)的詳細(xì)過(guò)程
這篇文章主要介紹了Win11+VS2022編譯FFmpeg6.0靜態(tài)庫(kù)的方法,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Windows平臺(tái)下配置VS Code的C++環(huán)境教程
這篇文章主要介紹了Windows平臺(tái)下配置VS Code的C++環(huán)境教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12C/C++中的sizeof運(yùn)算符和size_t類型的詳解
今天小編就為大家分享一篇關(guān)于C/C++中的sizeof運(yùn)算符和size_t類型的詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10