## 考古 1. 實做 C strlen, strcpy 等函式 2. 指標++ & ++指標 https://tclin914.github.io/e9206a47/ 4. [1470. Shuffle the Array](/ThKWR_YhS2uZv_wodiw31g) 5. 給一段遞迴code print 結果 6. [20. Valid Parentheses](/IgwwlhRiQXO4lv_AlSKF4w) 7. linklist insert & array reverse 8. 還有一些偏韌體ISR的問題 ## 電訪 1. n 是否為 power of 2 ```c= bool isPowerOf2(int a) { int tmp = a & (~a + 1); return tmp == a; } ``` 2. queue v.s. linkedlist https://stackoverflow.com/questions/48401777/what-is-the-difference-between-linkedlist-and-queue ## [群聯三題](https://m033010041.github.io/2020/02/18/phison-interview-practice/) ## 面試 1. [local, static, global](/6E8YJc3vTj640nADvPvB0A) 2. [const, volatile](/6E8YJc3vTj640nADvPvB0A) 3. stack, heap 差別 https://pjchender.dev/computer-science/cs-stack-heap/ 5. function, ISR 差別 https://www.geeksforgeeks.org/difference-between-isr-and-function-call/ 7. function set bit, clear bit 9. (a & (a - 1) == 0x00) 什麼意思 **Ans : a is power of 2** https://stackoverflow.com/questions/600293/how-to-check-if-a-number-is-a-power-of-2 10. 依照順序填入 matrix | 0 | 1 | | - | - | | 2 | 4 | | 3 | 5 | | 6 | 7 | | 8 | 10 | | 9 | 11 | --- 1. Assuming that we are using 32-bit compiler, pointer in 4 bytes. ```c int array[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int *ptr = (int *) (&array + 1); int *ptr2 = array; ``` If the address of array is 200, try to answer the following questions: (1) &array = 200 (2) &array + 1 = 240 //跨了一整個array 所以位址+10 * sizeof(int) (3) ptr = 210 //依照宣告定義 所以同上 (4) *ptr = 未定義 //array的下一個位址的值是多少不知道 (5) ptr - 1 = 236 (6) *(ptr - 1) = 100 //array下一個位址往前一個位址後取值 即array的最後一個值 (7) *array = 10 //array取指標 隱性轉型 指向array第一個位址的值 (8) *array + 1 = 11 (9) *(array + 1) = 20 (10) ptr2 = 200 //指向array第一個位址 (11) *ptr2 = 10 //指向array第一個位址的值 (12) ptr2[1] = 20 (13) *(ptr2 + 1) =20 2. Try to write a function that will set value “0xaa55” in the memory address of “0x1234” ```cpp= int volatile * const p_reg = (int *) 0x1234; //set pointer to an address *p_reg = 0xaa55; // dereference to set the value ``` https://stackoverflow.com/questions/19133962/how-to-write-a-data-in-particular-address-in-c 3. What is the output of the following code? ```CPP= void change(int *a, int &b, int c) { c = *a; b = 3; *a = 2; return; } void main() { int a = 1, b = 2, c = 3; change(&a, b, c); printf(“%d %d %d”, a, b, c); return; } ``` **ANS: 2,3,3** 4. a. write a function to get bit18 value of an unsigned integer data and return 0 or 1. ```cpp= int get_18thbit(unsigned int n) { if(n &(n<<17)) { return 1; } else { return 0; } } ``` b. write a function to set bit18 value of an unsigned integer data. ```cpp= int set_18thbit(unsigned int n) { return n |(1<<17); } ``` c. write a function to clear bit18 value of an unsigned integer data. ```cpp= int clear_18thbit(unsigned int n) { return n & ~(n<<17); } ``` d. write a function to check the unsigned integer value is power of 2 ```cpp= bool IsPowerOfTwo(unsigned int x) { return (x != 0) && ((x & (x - 1)) == 0); } ``` 6. What is the result? ```CPP= int a[] = {1,2,3,4,5,6}; int *p = a; *(p++) += 100; // postfix先做等號兩邊運算 再做括號內的運算 所以是p[0]+100 再位址+1到p[1] *(++p) += 100; //prefix先做括號內的運算 再做等號兩邊運算 所以先位址+1到p[2]再取值+100 for(int i = 0; i<6 ; i++) printf("%d ", a[i]); //補充 int *p2 = a; int *p3 = a; int e = (*p2)++; //e = *p = 1, 再e+1 但沒有e = e+1 所以++沒用 int f = ++*p3; //f = *p2 + 1 = 2 cout << "e =" << e << endl; cout << "f =" << f << endl; ``` **ANS : 101, 2, 103, 4, 5, 6** <以下兩題見Leetcode> 5. 字串反轉 8. linked list找中點 ## Other questions [Excecise 1](https://www.dcard.tw/f/tech_job/p/238789639?cid=cab3300c-7a4e-4b5a-b533-2887ec512e51&fbclid=IwAR3fgbzke8Q2VeLGF4GMcC9YSKAYjCVWE_3JO_WvDAJp-9WFqwDD4jkFWcY) [Exercise 2](https://creteken.pixnet.net/blog/post/24524138)