文章目錄
- 前言
- 練習
- 二維陣列練習
- 與我認知有些偏差的:
- 結束
前言
咳咳,本文是關于之前知識點的一些小練習可以鞏固一下基礎廢話不多講直接開始,本文的小練習我直接以代碼塊加注釋解決了,望大家體諒,下次加上了之前沒講到的知識點和例子,
大家期待一下(三)很快估計明天就出了,
練習
//一維陣列 int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16 sizeof內包含且只包含陣列名就是算他所有元素的
//位元組大小相當于&a
printf("%d\n",sizeof(a+0));//4/8沒有只包含陣列名他就是第一個元素的地址所以是4/8
//看是64位還是32位
printf("%d\n",sizeof(*a)); // 4 對字符名解參考就是首元素型別是int 所以答案是4
printf("%d\n",sizeof(a+1)); //4 記憶體+1跳躍相應型別的位元組型別為int跳躍四個位元組
printf("%d\n",sizeof(a[1])); //4 int型別的元素
printf("%d\n",sizeof(&a)); //4/8 雖然是陣列的地址但依舊只是一個地址
printf("%d\n",sizeof(*&a));//&a得到的陣列的元素地址對其*解參考就是得到了整個陣列
printf("%d\n",sizeof(&a+1)); // 4/8 跳過一整塊陣列后的地址
printf("%d\n",sizeof(&a[0])); // 4/8 首元素的地址
printf("%d\n",sizeof(&a[0]+1));// 4/8 第二個元素的地址
//字符陣列
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); // 6 char型別的元素大小為1
printf("%d\n", sizeof(arr+0)); // 4/8 首元素地址
printf("%d\n", sizeof(*arr)); // 1 首元素
printf("%d\n", sizeof(arr[1])); // 1 第二個元素
printf("%d\n", sizeof(&arr)); // 4/8 整個陣列的地址
printf("%d\n", sizeof(&arr+1));//4/8 跳過整個陣列后的第一個地址
printf("%d\n", sizeof(&arr[0]+1)); // 4/8 第二個元素的地址
//strlen 是通過地址尋找地址對應元素的\0來使自己暫停增加的原碼對應:
//size_t strlen(const char* arr)
//(Tips:size_t就是編譯器自己定義的unsigned long int)沒啥特別的,
//下列的隨機值的大小相同
printf("%d\n", strlen(arr)); // 隨機值 具體要看在哪遇見\0
printf("%d\n", strlen(arr+0));//隨機值
printf("%d\n", strlen(*arr));//報錯,此寫法為錯誤寫法
printf("%d\n", strlen(arr[1])); //報錯
printf("%d\n", strlen(&arr));//隨機值
printf("%d\n", strlen(&arr+1));//隨機值-6
printf("%d\n", strlen(&arr[0]+1));//隨機值-1
------------------------(快樂分界線)--------------------------------------
char arr[] = "abcdef";//字串和字符陣列幾乎沒有區別除了在末尾多了個\0
printf("%d\n", sizeof(arr));//7 六個元素加上\0
printf("%d\n", sizeof(arr+0));//4/8 首元素地址的大小
printf("%d\n", sizeof(*arr));//1 首元素大小
printf("%d\n", sizeof(arr[1]));//1 第二個元素的大小
printf("%d\n", sizeof(&arr));//4/8 首元素地址的大小
printf("%d\n", sizeof(&arr+1));//4/8 陣列后第一個地址的大小
printf("%d\n", sizeof(&arr[0]+1));//4/8 第二個地址的大小
printf("%d\n", strlen(arr)); //6 正常用法
printf("%d\n", strlen(arr+0));//6 傳的地址相同
printf("%d\n", strlen(*arr));//報錯 傳的是首元素對應ASCII值
printf("%d\n", strlen(arr[1]));//報錯第二個元素的ASCII值
printf("%d\n", strlen(&arr));//6&arr 和arr數值上相同
printf("%d\n", strlen(&arr+1));//隨機值
printf("%d\n", strlen(&arr[0]+1));// 5傳的是第二個元素的地址
char *p = "abcdef";
//指標和陣列的字串的區別有 &p 和&arr不是一個型別 而且在sizeof中也有不同
printf("%d\n", sizeof(p));// 4/8 p為地址
printf("%d\n", sizeof(p+1));// 4/8 第二個元素地址的大小
printf("%d\n", sizeof(*p));// 1 char型別1個位元組大
printf("%d\n", sizeof(p[0])); // 1 char 型別1個位元組大 p[0]-->*(p+0)
printf("%d\n", sizeof(&p));// 4/8 存放p指標變數的地址
printf("%d\n",sizeof(&p+1));// 4/8 p地址后的地址 注意:跳了四個位元組
printf("%d\n", sizeof(&p[0]+1));//4/8 第二個元素的地址
printf("%d\n", strlen(p)); //6對應strlen 的引數為指標就可理解
printf("%d\n", strlen(p+1));//5 從第二個元素的地址開始 注意:&p+1跳四個位元組 p+1跳
//的位元組與p的型別有關
printf("%d\n", strlen(*p));//報錯
printf("%d\n", strlen(p[0]));//報錯
printf("%d\n", strlen(&p));//隨機值
printf("%d\n", strlen(&p+1));//隨機值 兩個隨機值無關
printf("%d\n", strlen(&p[0]+1));//5
------------------------(快樂分界線)--------------------------------------

二維陣列練習
//二維陣列
//二維陣列與一維陣列相類似在儲存上都是連續的
//二維陣列的每一行都可以當一維陣列
int a[3][4] = {0};
printf("%d\n",sizeof(a));// 48 4*4*3
printf("%d\n",sizeof(a[0][0]));// 4 第一行第一個元素
printf("%d\n",sizeof(a[0])); // 16 a[0]是一個記憶體但是把它放在sizeof中就可以把它理
//解成第一行元素的一維陣列
//前提條件是將它單獨放在sizeof內
printf("%d\n",sizeof(a[0]+1)); // 4/8 a[0]本就是記憶體+1后不再單獨放在sizeof里就不
//可以看做一維陣列了a[0]+1指向第一行的第二個元素
//相當于&a[0][1];
printf("%d\n",sizeof(*(a[0]+1)));// 4 int型別相當于a[0][1];
printf("%d\n",sizeof(*(a+1)));// 4 int 型別相當于a[0][1];
printf("%d\n",sizeof(&a[0]+1));// 4/8 記憶體相當于&a[1][0]
printf("%d\n",sizeof(*(&a[0]+1)));//4 int型別a[1][0] &a[0]就相當于取出第一行地
//址一跳就跳一行
printf("%d\n",sizeof(*a)); // 4 int型別a[0][0]
printf("%d\n",sizeof(a[3]));// 16 雖然a[3]沒有被定義(我們的陣列就只有0 1 2行)但是
//在sizeof里是不會對陣列進行訪問的他只看陣列的型別我們
//a[3]的型別是 int [4] 在sizeof看來就是4*4=16.
與我認知有些偏差的:
printf("%d\n",sizeof(a+0));//4/8沒有只包含陣列名他就是第一個元素的地址所以是4/8
//看是64位還是32位
printf("%d\n",sizeof(*&a));//&a得到的陣列的元素地址對其*解參考就是得到了整個陣列
printf("%d\n",sizeof(&a)); //4/8 雖然是陣列的地址但依舊只是一個地址
//strlen 是通過地址尋找地址對應元素的\0來使自己暫停增加的原碼對應:
//size_t strlen(const char* arr)
//(Tips:size_t就是編譯器自己定義的unsigned long int)沒啥特別的,
printf("%d\n", strlen(*arr));//報錯,此寫法為錯誤寫法
printf("%d\n", strlen(arr[1])); //報錯 因為strlen需要的引數是地址
printf("%d\n", sizeof(p));// 4/8 p為地址
//二維陣列
printf("%d\n",sizeof(a[0])); // 16 a[0]是一個記憶體但是把它放在sizeof中就可以把它理
//解成第一行元素的一維陣列
//前提條件是將它單獨放在sizeof內
printf("%d\n",sizeof(a[3]));// 16 雖然a[3]沒有被定義(我們的陣列就只有0 1 2行)但是
//在sizeof里是不會對陣列進行訪問的他只看陣列的型別我們
//a[3]的型別是 int [4] 在sizeof看來就是4*4=16.
printf("%d\n",sizeof(a[3])); 我們在使用sizeof(4+1)是sizeof也會回傳值時4因為
他是整形型別.
結束
我現在是先記筆記然后粘貼到CSDN上最后進行一些小優化就上傳了可能有地方沒有照顧到希望大家斧正
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402736.html
標籤:其他
上一篇:C語言資料結構與演算法----樹和二叉樹全面總結(中)
下一篇:C++實作AVL樹
