杂记3
0. const受保護權限
? 請看下面的代碼片
? int num = 0;
? const int *p = #
? 這一段代碼在C語言中是可以通過的,因為num在定義的時候沒有修飾,所以權限很大,當用*p指向它的時候可以對它進行修改。
? 再看下面的代碼片:
? const int num = 0;
? int *p = #
? 這段代碼在C編譯器中會報錯,原因是,定義num的時候被const修飾,那么這個num就是受保護的,即是num不能隨便改變,所以當用*p指向它的時候會報錯。
1. printf的返回值
?C語言中printf的返回值是打印在屏幕上的字符的個數。
2. 計算一個數二進制位中1的個數
? 這里我們提供第二種方法就是,我們可以使這個數先&1,如果結果是是1,則count++,然后把這個數右移一位,再次&1,這些操作放在一個循環里面,循環32,但是這樣做循環了32,如果我只是后幾位有1,前面都是0呢,顯然這樣做的話還不是最優的結果
? 下面我們提供第三種方式,int n = 11;n = n&(n-1);這里n&(n-1)實際的操作結果就把原本的n的二進制中的最后一個1消掉了,這就是突破點。我們可以利用這個特點,做一個循環while(n != 0){count++;n=n&(n-1)};這個時候計算的count就是n中1的個數。
3. 數值和0的比較
? 整型和0的比較:if(0 == a)
?? 指針和0的比較:if(NULL == p)
?? 浮點型和0比較:if(a>-0.000000000000001&&a<0.00000000000000001)
4. 數組名
? int arr[10];
? 1.?? int sz = sizeof(arr);
? 2.?? &arr;
只有上面的這兩種數組名的使用方式時,arr代表的是整個數組,其余的方式均表示數組首元素的地址。
如:sizeof(arr + 1);它表示的就是數組下標為1的元素。
5. 用聯合體測試大小端
請看下面的代碼片
?? ?union tag{
?? ??? ?int a;
?? ??? ?char c;
?? ?}tag;
?? ?tag.a = 1;
?? ?printf("%c",tag.c);??? //因為在聯合體中,a和c使用共同的存儲空間,且他們的起始位置一致,所以當給賦值1之后,
?? ??????????????????????? //如果是小端存儲則這個1被放在了高地址,即他們的共同內存中的后面的位置,
?? ??????????????????????? //這樣使用%c打印的時候,是從開始的地方算起,所以就得到一個未知的量
6.memset的使用
? memset(地址,0,sizeof(...))
? 地址傳入的是一個地址,然后那個0是你要初始化的內容,最后的是長度習慣用sizeof進行求解,這里的長度是以字節為單位的
7.malloc申請空間后判斷
pmail->maillist = (PeoInfo*)malloc(sizeof(PeoInfo)*ALLMAX);
?? ?if (NULL == pmail->maillist)
?? ?{
?? ??? ?perror("malloc失敗");
?? ??? ?return;
?? ?}
8. 鏈表操作
?鏈表中有一些內容不好操作時,比如刪除屋頭節點的非尾節點,或者在鏈表前面插入一個元素,想著用賦值操作
9.pmail->maillist = realloc((pmail->maillist), sizeof(PeoInfo)*((pmail->MAX) + 3));
總結
- 上一篇: C语言volatile关键字详解
- 下一篇: 操作符和表达式