字符串和字符數組的細節


字符串和字符數組的細節

     1、  sizeof是C語言的一個關鍵字,也是C語言的一個運算符(sizeof使用時是sizeof(類型或變量名),所以很多人誤以為sizeof是函數,其實不是);                   sizeof運算符用來返回一個類型或者是變量所占用的內存字節數。為什么需要sizeof?主要原因一是int、double等原生類型占幾個字節和平台有關;二             是C語言中除了ADT外還有UDT,這些用戶自定義類型占幾個字節無法一眼看出,所以用sizeof運算符來讓編譯器幫忙計算。

     2、strlen是一個C語言的庫函數,這個庫函數的原型是:size_t_strlen(const char *s);這個函數接收一個字符串的指針,返回這個字符串的長度(以字節為單位)。注意一點是:strlen返回的字符串長度是不包含字符串結尾的‘\0'的。我們為什么需要strlen庫函數?因為從字符串的定義(指針指向頭、固定結尾、中間依次相連)可以看出無法直接得到字符串的長度,需要strlen的來計算出字符串的長度。

#include<stdio.h>
#include<string.h>

int mystrlen(const char *p)
{
	int cnt = 0;
	while(*p != '\0')
	{
		cnt++;
		p++;
	}
	return cnt;
}
int main(void)
{
   char *p = "Linux";
   
   // int len = strlen(p); strlen()函數內部就是上面寫的mystrlen()
   int len = mystrlen(p);
	
   printf("len = %d.\n",len);
   
   return 0;
}

  

 

     3、sizeof(數組名)得到的永遠是數組的元素個數(也就是數組的大小),和數組中有無初始化,初始化多、少等是沒有關系的。strlen是用來計算字符串            的長度的,只能傳遞合法的字符串進去才有意義,如果隨便傳遞一個字符指針,但是這個字符指針並不是字符串是沒有意義。

     4、當我們定義數組時如果沒有明確給出數組大小,則必須同時給出初始化式,編譯器會根據初始化式去自動計算數組的大小(數組定義時必須給出大小,要           么直接給,要么給初始化式)

字符串初始化與sizeof、strlen
(1)char *p = "linux"; sizeof(p)得到的永遠是4,因為這時候sizeof測的是字符指針p本身的長度,和字符串的長度是無關的。
(2)strlen剛好用來計算字符串的長度。

 

字符數組與字符串的本質差異(內存分配角度)
(1)字符數組char a[] = "linux";來說,定義了一個數組a,數組a占6字節,右值"linux"本身只存在於編譯器中,編譯器將它用來初始化字符數組a后丟棄掉(也     就是說內存中是沒有"linux"這個字符串的);這句就相當於是:char a[] = {'l', 'i', 'n', 'u', 'x', '\0'};
(2)字符串char *p = "linux";定義了一個字符指針p,p占4字節,分配在棧上;同時還定義了一個字符串"linux",分配在代碼段;然后把代碼段中的字符串        (一共占6字節)的首地址(也就是'l'的地址)賦值給p。
    總結對比:字符數組和字符串有本質差別。字符數組本身是數組,數組自身自帶內存空間,可以用來存東西(所以數組類似於容器);而字符串本身是指針,     本身永遠只占4字節,而且這4個字節還不能用來存有效數據,所以只能把有效數據存到別的地方,然后把地址存在p中。
    也就是說字符數組自己存那些字符;字符串一定需要額外的內存來存那些字符,字符串本身只存真正的那些字符所在的內存空間的首地址。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM