關於strlen於sizeof列印方面的問題:
#include
#include
int main()
;//%p是用來列印指標變數(列印的是乙個陣列)
指標+1位址跳過乙個元素(取決於元素的sizeof)
//printf("%p\n",arr);//arr隱式轉為指標,指向首元素的位址
//printf("%p\n",arr+1);
//printf("%p\n",&arr); //&arr直接對陣列名取位址,得到的是乙個指向這個陣列的指標,「陣列指標」,int(*)[10]
//libprintf("%p\n",&arr+1);
// int (*p)[10]=&arr
//陣列指標在實際開發中使用場景十分少,二維陣列傳參的時候可以用到
// int arr[3][4]=;//長度為3的一維陣列,每個元素的長度為4
//第一組(在32位系統下)
//int arr = ;
//printf("%d\n",sizeof(arr));//列印16,int為4,四個元素,所以列印16
//printf("%d\n",sizeof(arr+0));//列印 4,int* arr.
//printf("%d\n", sizeof(*arr));//4, arr已經隱式轉為int* 在解引用,得到 int
//printf("%d\n", sizeof(arr + 1));//4,arr已經隱式轉為指標
//printf("%d\n", sizeof(&arr)); //4,陣列指標,
//printf("%d\n", sizeof(arr[1])); //4,int型別
//printf("%d\n", sizeof(*&arr)); //16, &arr是陣列指標,再次*從這個地市開始去int(*)[4]型別對應的位元組數
//printf("%d\n", sizeof(&arr + 1)); //4 ,&arr是陣列指標,int(*)[4]再+1還是乙個指標,所以還是四個位元組
//printf("%d\n", sizeof(&arr[0]));//4 arr[0]為int &將其隱式轉為指標得到int*型別
//printf("%d"\n, sizeof(&arr[0] + 1);// 4 同上, 指標+1還是指標
//第二組
//char arr = ;
//printf("%d\n", sizeof(arr)); // 6 arr就是乙個普通的字元陣列
//printf("%d\n", sizeof(arr + 0));//4 arr+0得到乙個char * ,只要是指標變數,就是佔四個位元組
//printf("%d\n", sizeof(*arr)); // 1 *arr得到乙個 char ,只要是指標變數,就是佔4個位元組
//printf("%d\n", sizeof(arr[1])); // 1 arr[1]得到的就是乙個char,就是佔乙個位元組
//printf("%d\n", sizeof(&arr)); //arr隱式轉為指標,在32位作業系統下指標就位 4
//printf("%d\n", sizeof(&arr + 1)); // 4 同上,隱式轉為指標,指標+1還是指標
//printf("%d\n", sizeof(&arr[0] + 1));// 4 &arr[0]得到char*,+1還是char*
//printf("%d\n", strlen(arr)); 未定義行為ub
//printf("%d\n", strlen(arr + 0));//未定義行為
//*arr得到的是char型別的,strlen要求的引數是char *型別的
//printf("%d\n", strlen(*arr));//這個**按理來說,是要編譯報錯的.但是c是弱型別的程式語言,把char和char*隱式轉換了
//printf("%d\n", strlen(arr[1]));//效果同上
//第三組
//char arr = "abcdef";
//printf("%d\n", sizeof(arr)); //7 sizeof是求記憶體的大小,這個大小要包含\0
//printf("%d\n", sizeof(arr+0));//4 隱式轉為char* 指標
//printf("%d\n", sizeof(*arr));//得到乙個char 列印1
//printf("%d\n", sizeof(arr[1]));//得到乙個char 列印1
//printf("%d\n", sizeof(&arr));// 4 隱式轉為指標char *
//printf("%d\n", sizeof(&arr+1));//4 理由同上,指標+1還是指標
//printf("%d\n", sizeof(&arr[0]+1));// 4 &arr[0]+1得到乙個char * 指標
//printf("%d\n", strlen(arr)); //6此處是求字串長度,不算\0;
//printf("%d\n", strlen(arr + 0));// 6
//printf("%d\n", strlen(*arr));//未定義行為 ub *arr得到字元,char和char*型別不匹配.編譯失敗
//printf("%d\n", strlen(arr[1]));//同上
//printf("%d\n", strlen(&arr));//6 &arr 得到char(*)[7]型別,和char*型別不匹配,按理來說是編譯失敗,&arr碰巧和arr的到的位址指,是相同的值.純屬巧合
//printf("%d\n", strlen(&arr + 1));//ub &arr+1跳過了整個陣列,訪問陣列後面的空間,非法記憶體
//printf("%d\n", strlen(&arr[0] + 1));//5 &arr[0]得到乙個char* char*+1跳過乙個元素
//第四組
//char* p = "abcdef";
//printf("%d\n", sizeof(p)); //4 p是乙個指標
//printf("%d\n", sizeof(p+1)); //4 指標+1還是指標
//printf("%d\n", sizeof(*p)); //1 p是char* 解引用後的到乙個char 列印1
//printf("%d\n", sizeof(p[1]));// 1 p[1]是char
//printf("%d\n", sizeof(&p)); //4 p是char* &p相當於char** 二級指標還是指標
//printf("%d\n", sizeof(&p+1)); //4 理由同上
//printf("%d\n", sizeof(&p[0]+1)); //4 p[0]是char &p[0]相當於char* 再加1還是char *
//printf("%d\n", strlen(p)); //列印字串 6
//printf("%d\n", strlen(*p)); //ub *p是char strlen 要求引數是char *,型別不匹配
//printf("%d\n", strlen(p[1])); //p[1]是char ,型別不匹配
//printf("%d\n", strlen(&p)); //ub &p得到char** 和char*是不同型別的,原則上是編譯失敗的,此時 把char**強轉成了char* 並不是乙個真正的字串
//printf("%d\n", strlen(&p+1)); //ub 同上
//printf("%d\n", strlen(&p[0]+1));//5 &p[0]相當於乙個char* 指標+1跳過乙個元素輸出字串長度為5
//第五組 二維陣列
//所謂的二維陣列,本質上就是乙個一維陣列.裡邊的每乙個元素又是乙個一維陣列
//長度為3個元素的一維陣列,裡邊的每個元素又是長度為4的一維陣列
int a[3][4] = ,
, ,};//printf("%d\n", sizeof(a));// 48 12個元素每個元素佔4個位元組
//printf("%d\n", sizeof(a[0][0])); // 4 a[0][0]相當於int
//printf("%d\n", sizeof(a[0])); //16 a[0]相當於int[4]
//printf("%d\n", sizeof(a[0]+1)); //4 a[0]相當於int[4]再加1 隱式轉成了int*
//*(a[0]+1)相當於a[0][1]等價於2
//printf("%d\n", sizeof(* (a[0] + 1) ));//4 a[0]等價於int[4]再+1,隱式轉為int * 再*得到int
//printf("%d\n", sizeof((&a[0] + 1))); // 4 a[0]+1相當於int* 再& 得到int** 還是指標
//printf("%d\n", sizeof(*(&a[0] + 1)));//4 a[0]+1相當於int* 再& 得到int** 還是指標 再*得到int *
//printf("%d\n", sizeof(*a)); //*a等價於*(a+0)=>a[0]結果int[4]
//printf("%d\n", sizeof(a[100]));//16 sizeof是乙個運算子(不是函式),特點是,編譯期求值
return 0;
sizeof 與 strlen 的區別
一 示例 eg1 下列 char buffer 256 char pbuffer buffer cout sizeof buffer cout sizeof pbuffer 其執行結果為 eg2 簡單說明 sizeof gives the amount of storage,in bytes,ass...
strlen與sizeof的區別
1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3.sizeof可以用型別做引數,strlen只能用char 做引數,且必須是以 0 結尾的。4....
sizeof與strlen的區別
sizeof 表示式 是c c 關鍵字 不是函式 功能 返回 表示式 結果所佔機器 位元組 的大小。strlen 字串 是c c 標準庫的函式 不是關鍵字 在標頭檔案 string.h 中宣告。功能 計算 字串 中的 0 之前的字元個數。特別注意 strlen總是假定傳給它的引數是以null結束符 ...