一、offsetof宏
首先我們要了解什么是offsetof宏:
. 此具有函數(shù)形式的宏返回數(shù)據(jù)結(jié)構(gòu)或聯(lián)合類型中成員成員的偏移值(以字節(jié)為單位)。
. 返回的值是size_t類型的無符號整數(shù)值,其字節(jié)數(shù)位于指定成員與其結(jié)構(gòu)開頭之間。
什么意思呢,可以看到下面這張圖片:
下面我們來看到這一習題:
習題內(nèi)容:
寫一個宏,計算結(jié)構(gòu)體中某變量相對于首地址的偏移。
解題思路:
根據(jù)題意,我們需要先定義一個宏OFFSETOF,因為要返回成員變量相對于起始位置的偏移量,所以需要傳入結(jié)構(gòu)體名稱以及成員變量名;
那怎么計算偏移量呢?
我們可以將起始地址取為0x00000000,然后返回成員變量的地址,那所得的結(jié)果就是偏移量啦;
代碼演示:
#include<stdio.h>
#define OFFSETOF(STN,MEN) (int)&(((struct S*)0)->MEN)
typedef struct S
{
int a;
char b;
char c;
int d;
}node;
int main()
{
printf("%d\n", OFFSETOF(node S, a));
printf("%d\n", OFFSETOF(node S, b));
printf("%d\n", OFFSETOF(node S, c));
printf("%d\n", OFFSETOF(node S, d));
return 0;
}
}
輸出結(jié)果:
解析:
二、交換奇偶位
習題內(nèi)容 :
寫一個宏,可以將一個整數(shù)的二進制位的奇數(shù)位和偶數(shù)位交換。
解題思路:
根據(jù)題意,我們需要先定義一個宏EXCHANGE,需要傳入要交換變量的名稱;
因為要交換交換奇偶位,所以可以將奇數(shù)位和偶數(shù)位分別取出來,然后奇數(shù)位左移一位,
偶數(shù)位右移一位,相加所得的結(jié)果就是交換后的結(jié)果啦;
代碼演示:
#include<stdio.h>
#define EXCHANGE(n) (((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1))
int main() {
int a = 21;
int b = EXCHANGE(a);
printf("%d", b);
return 0;
}
運行結(jié)果:
解析:
三、原地移除數(shù)組
習題內(nèi)容:
原地移除數(shù)組中所有的元素val,要求時間復雜度為O(N),空間復雜度為O(1)
要求:移除數(shù)組中需要移除的元素后,返回新的數(shù)組長度
解題思路:
根據(jù)題意,這道題我們可以用雙指針的方法,先讓一個指針指向數(shù)組起始位置,后一個指針隨著for循環(huán)移動,找到如果不是要移除的數(shù),就將它移動到第一個指針所在位置,然后第一個指針后移,這樣第一個指針最后就會指向最終數(shù)組的后一位,而其所在位置下標就是新數(shù)組長度;
代碼演示:
#include<stdio.h>
int removeElement(int* nums, int numsSize, int val) {
int pos = 0;
for (int i = 0; i < numsSize; i++) {
if (nums[i] != val) {
nums[pos] = nums[i];
pos++;
}
}
return pos;
}
int main() {
int arr[] = { 0,1,2,2,3,0,4,2 };
int val = 2;
int len = sizeof(arr) / sizeof(arr[0]);
int ret=removeElement(arr,len,val);
for (int i = 0; i < ret; i++) {
printf("%d ", arr[i]);
}
return 0;
}
運行結(jié)果:
解析:文章來源:http://www.zghlxwxcb.cn/news/detail-611290.html
總結(jié)
這些試題是我覺得比較典型的例題,在這里就給大家展示一下;
希望大家好好學習,天天向上!文章來源地址http://www.zghlxwxcb.cn/news/detail-611290.html
到了這里,關(guān)于C語言習題練習的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!