strlen於sizeof相關問題

2021-10-03 13:19:03 字數 4708 閱讀 1389

關於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結束符 ...