關於sizeof 和strlen 的用法

/*
       2016年6月6日12:40:22    關於sizeof 和 strlen 的用法
*/
#include<stdio.h>
#include<string.h>


void sizeofApp(char * a)
{
    printf("%d %d %d\n",sizeof(a),sizeof(*a),strlen(a));
}


int main(void)
{
char str1[] = "1";
char str2[] = "11";
 
printf("sizeof(str1) = %d\n",sizeof(str1));
printf("sizeof(str2) = %d\n",sizeof(str2));
printf("strlen(str1) = %d\n",strlen(str1));
printf("strlen(str2) = %d\n",strlen(str2));
sizeofApp(str1);
sizeofApp(str2);
return 0;
}
/*
在VC++中的結果是:
sizeof(str1) = 2
sizeof(str2) = 3
strlen(str1) = 1
strlen(str2) = 2
4 1 1
4 1 2
Press any key to continue
分析:爲什麼會出現這樣的結果,sizeof 在不不同的函數裏對同一個數組進行處理,結果不一樣
      ①首先來看看sizeof的作用,sizeof作用就是返回一個對象或者類型所佔的字節數
        先來看一看第一個 4 是怎樣來的 ,首先 char str1[] = "1" 語句申請了兩個字節的內存空間(一個字節保存 '\0')
   然後將str1數組的首地址傳給sizeofApp的形參,記住,這時候接收的是str1的首地址,這時候形參a的值就變成了str1的首地址,然後sizeof(a)這個
   語句的功能是計算 a (也就是存str1首地址的指針變量)的所佔內存字節大小
,在32位機下,指針變量所佔內存大小都是4個字節,所以說值爲4,同
   樣的道理,第二個4也一樣
 ②然後我們看第一個4後面的1是怎麼來的,我們前面說了,sizeofApp(str1)是把str1的首地址傳給了sizeofApp,那麼 a 就指向了str1 數組的第一個元素
        * a 就代表了第一個元素, 所以說 sizeof(*a) 的意思就是說 計算 a[0] 即 str1[0] 所佔的內存 顯然 這個數組中的一個元素所佔內存爲 1個字節
   所以值爲1(注意:這時候 sizeof(*a) 不是計算整個數組所佔內存大小)
 ③在來看第一個4後面的第二個1,首先我們看一下strlen的含義,strlen是計算機C語言的函數,作用是計算字符串s的長度(也就是說有幾個元素),不包
   括'\0'在內,它從內存的某個位置開始掃描,知道碰到第一個字符串結束符'\0',爲止,然後返回計數值這個例子中,主函數中使用strlen(str1),其過程
就是碰到 字符 1 計 1 碰到字符 \0 停止 返回 1 ;而在被調函數中, a 指向了 str1 的第一個元素,然後 訪問 第一個元素 1 計 1 訪問第二個元素
停止,返回1 和在主函數是一樣的
其他的可以自行分析
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章