日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有关数组的运算 (sizeof)(strlen)

發(fā)布時(shí)間:2025/3/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有关数组的运算 (sizeof)(strlen) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一維數(shù)組

int a[ ] = { 1,2,3,4 };

printf("%d\n", sizeof(a)); ? ? ? ? ? ? ? ?//16 ? ?

//數(shù)組名單獨(dú)放在sizeof內(nèi)部,數(shù)組名表示整個(gè)數(shù)組。 sizeof(數(shù)組名)計(jì)算的是整個(gè)數(shù)組的大小,單位是字節(jié)。

printf("%d\n", sizeof(a + 0)); ? ? ? ? ?//4 ? ? 不是單獨(dú)放在sizeof內(nèi)部,它表示首元素地址

printf("%d\n", sizeof(*a)); ? ? ? ? ? ? ? //4 ? ? 首元素

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? *a == *(a + 0) == a[0];

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? arr[i] ==> *(arr + i)

printf("%d\n", sizeof(a + 1)); ? ? ? ? ?//4 ? ? 第二個(gè)元素地址?

printf("%d\n", sizeof(a[1])); ? ? ? ? ? ?//4 ? ??第二個(gè)元素

printf("%d\n", sizeof(&a)); ? ? ? ? ? ??//4 ? ? ?&a取的是數(shù)組的地址,無論取誰的地址,都是4個(gè)字節(jié)(32位)

拓展:

我們來看看下面這些

printf("%p\n", &a[0]); printf("%p\n", a); printf("%p\n", &a);

它們的結(jié)果是

那改成下面這樣呢,再來看

printf("%p\n", &a[0] ); printf("%p\n", &a[0]+1); printf("%p\n", a); printf("%p\n", a + 1); printf("%p\n", &a); printf("%p\n", &a + 1);

結(jié)果如下

?

我們發(fā)現(xiàn),&a[0] + 1和a + 1都跳了4個(gè)字節(jié),即跳到第二個(gè)元素,而&a+1它跳過了16個(gè)字節(jié),也就是跳過了整個(gè)數(shù)組

printf("%d\n", sizeof(*&a)); ? ? ? ? ? ?//16 ? 指針訪問整個(gè)數(shù)組

printf("%d\n", sizeof(&a + 1)); ? ? ? //4 ? ? 跳過整個(gè)數(shù)組的下一個(gè)地址

printf("%d\n", sizeof(&a[0])); ? ? ? ? //4 ? ??

printf("%d\n", sizeof(&a[0] + 1)); ? //4

?

?

字符數(shù)組

char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", sizeof(arr)); ? ? ? ? ? ? ?//6 ? ? 整個(gè)數(shù)組

printf("%d\n", sizeof(arr+0)); ? ? ? ? //4 ? ? 首元素地址(不要以為是char類型就以為是1,它就是個(gè)地址)

printf("%d\n", sizeof(*arr)); ? ? ? ? ? ?//1 ? ? 首元素

printf("%d\n", sizeof(arr[1])); ? ? ? ? //1 ? ? 第二個(gè)元素

printf("%d\n", sizeof(&arr)); ? ? ? ? ? //4 ? ?首元素地址

printf("%d\n", sizeof(&arr+1)); ? ? ?//4 ? ??跳過這個(gè)數(shù)組后的地址

printf("%d\n", sizeof(&arr[0]+1)); ?//4 ? ? 第二個(gè)首元素地址

?

//strlen ?求字符串長度

printf("%d\n", strlen(arr)); ? ? ? ? ? ? ?// ? ? 隨機(jī)值 ? ? ? strlen求字符串長度需要字符串以\0結(jié)束,而這個(gè)數(shù)組中沒有\(zhòng)n

printf("%d\n", strlen(arr + 0)); ? ? ? ?// ? ? 隨機(jī)值 ? ? ?原因同上

printf("%d\n", strlen(*arr)); ? ? ? ? ? ? // ? ? 程序錯(cuò)誤 ? *arr是個(gè)值

printf("%d\n", strlen(arr[1])); ? ? ? ? ?// ? ? 程序錯(cuò)誤 ? ?原因同上

printf("%d\n", strlen(&arr)); ? ? ? ? ? // ? ? 隨機(jī)值

printf("%d\n", strlen(&arr + 1)); ? ? // ? ? 隨機(jī)值

printf("%d\n", strlen(&arr[0] + 1)); // ? ? 隨機(jī)值

?

char arr[] = "abcdef";?

printf("%d\n", sizeof(arr));? ? ? ? ? ? ? ? ?// 7 ? ? ?arr[]={{a},{b},{c},ozvdkddzhkzd,{e},{f},{\0}};

printf("%d\n", sizeof(arr + 0)); ? ? ? ? ? // 4 ? ? ?

printf("%d\n", sizeof(*arr)); ? ? ? ? ? ? ? ?// 1 ? ? ?

printf("%d\n", sizeof(arr[1])); ? ? ? ? ? ? // 1

printf("%d\n", sizeof(&arr)); ? ? ? ? ? ? ?// ?4

printf("%d\n", sizeof(&arr + 1)); ? ? ? ?// 4

printf("%d\n", sizeof(&arr[0] + 1)); ? ?// 4

?

printf("%d\n", strlen(arr)); ? ? ? ? ? ? ? ? ? // 6 ? ? ? ? ? ? ? ? 雖然字符串最后有‘\0’,strlen求長度不算'\0'

printf("%d\n", strlen(arr + 0)); ? ? ? ? ? ?// ?6

printf("%d\n", strlen(*arr)); ? ? ? ? ? ? ? ?// ? 程序錯(cuò)誤

printf("%d\n", strlen(arr[1])); ? ? ? ? ? ? // ? 程序錯(cuò)誤

printf("%d\n", strlen(&arr)); ? ? ? ? ? ? ??// ? 6

printf("%d\n", strlen(&arr + 1)); ? ? ? ?// ? ?隨機(jī)值 ? ? ? ?跳過這個(gè)數(shù)組開始計(jì)算,不知道什么時(shí)候會(huì)碰到‘\0’

printf("%d\n", strlen(&arr[0] + 1)); ? ?// ? 5 ? ? ? ? ? ? ? ? 從第二個(gè)元素地址開始( 6 - 1 = 5 )

?

?

char *p = "abcdef";?

printf("%d\n", sizeof(p)); ? ? ? ? ? ? ? ? // 4 ? ? ?p是個(gè)指針變量,4個(gè)字節(jié)

printf("%d\n", sizeof(p + 1)); ? ? ? ? ?// ?4 ? ? ?p+1存的第二個(gè)元素的地址,4個(gè)字節(jié)

printf("%d\n", sizeof(*p)); ? ? ? ? ? ? ? // ?1 ? ? ?首元素

printf("%d\n", sizeof(p[0])); ? ? ? ? ? ?// ?1 ? ? ?

printf("%d\n", sizeof(&p)); ? ? ? ? ? ? ?// ?4 ? ??指針變量地址

printf("%d\n", sizeof(&p + 1)); ? ? ??// ?4 ? ? ?p的地址的下一個(gè)地址,與數(shù)組無關(guān)了

printf("%d\n", sizeof(&p[0] + 1)); ? // ?4 ? ??第二個(gè)元素的地址

?

printf("%d\n", strlen(p)); ? ? ? ? ? ? ? ? // ?6

printf("%d\n", strlen(p + 1)); ? ? ? ? ?// ? 5

printf("%d\n", strlen(*p)); ? ? ? ? ? ? ? // ? 程序錯(cuò)誤

printf("%d\n", strlen(p[0])); ? ? ? ? ? ?// ? 程序錯(cuò)誤

printf("%d\n", strlen(&p)); ? ? ? ? ? ??// ? 隨機(jī)值 ? ? 從p的地址開始數(shù),不知道后面的情況

printf("%d\n", strlen(&p + 1)); ? ? ? // ?隨機(jī)值

printf("%d\n", strlen(&p[0] + 1)); ? // ?5

?

二維數(shù)組

int a[3][4] = { 0 };

printf("%d\n", sizeof(a)); ? ? ? ? ? ? ? ??// ?48

printf("%d\n", sizeof(a[0][0])); ? ? ? ?// ?4

printf("%d\n", sizeof(a[0])); ? ? ? ? ? ?// ?16 ? 相當(dāng)于第一行的數(shù)組名

printf("%d\n", sizeof(a[0] + 1)); ? ? ?// ?4 ? ? a[0]相當(dāng)于第一行的數(shù)組名,它不單獨(dú)在sizeof() 內(nèi),所以a[0]降級(jí)為第一行第一個(gè)元素,a[0]+1則表示為第一行第二個(gè)元素地址

printf("%d\n", sizeof(a + 1)); ? ? ? ? ?// ? 4 ? ?a不單獨(dú)在sizeof() 內(nèi),二維數(shù)組 a 降級(jí)為一維數(shù)組 ,即第一行地址,+1就是第二行的地址(不是第二行第一個(gè)元素的地址)

printf("%d\n", sizeof(&a[0] + 1)); ??// ? 4 ? ?第二行的地址

printf("%d\n", sizeof(*a)); ? ? ? ? ? ? ??// ? 16 ??a不單獨(dú)在sizeof() 內(nèi),二維數(shù)組 a 降級(jí)為一維數(shù)組 ,即第一行地址

printf("%d\n", sizeof(a[3])); ? ? ? ? ???// ? 16 ? sizeof內(nèi)部不參與運(yùn)算,我們可以根據(jù)a[3]這個(gè)表達(dá)式推測(cè)出它和a[0]的類型是一樣的,所以無論a[ ]中是多少,它的大小都是16 ? ?(sizeof(int)是4,int是個(gè)類型)

?

總結(jié)

以上是生活随笔為你收集整理的有关数组的运算 (sizeof)(strlen)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。