1.const 關健字的作用
定義常量,防止變量被意外修改,增強程序的可讀性和維護性。
可以用于指針,聲明指向常量的指針或常量指針。
2.static關健字的作用
(1)在函數內,用于修飾局部變量,使其生命周期延長到整個程序運行期間,且只初始化一次。
(2)用于修飾全局變量或函數,限制其作用域為本文件。
3.volatile關健字的作用
volatile關鍵字的作用:主要用于告訴編譯器,該變量可能會被意想不到地改變(例如由硬件、多線程等因素),防止編譯器進行過度的優化。
4.extern和volatile的作用域說明
extern的作用域通常是全局的,用于在一個文件中聲明在其他文件中定義的變量或函數;volatile的作用域主要是在具體使用它的變量的作用范圍內。
volatile應該是在編譯階段,extern在鏈接階段。
volatile關鍵字的作用是防止變量被編譯器優化,而優化是處于編譯階段,所以volatile關鍵字是在編譯階段起作用。
5.C++中的struct和class區別
默認的訪問控制不同,struct默認成員是公共的,class默認成員是私有的。
但在其他方面基本相同,都可以包含成員變量和成員函數。
6.C++中vector和list的區別
vector底層是連續存儲,隨機訪問效率高,但插入和刪除可能效率較低且可能引起大量元素移動;list是雙向鏈表,插入和刪除效率高,但隨機訪問效率低。
vector更適合頻繁隨機訪問的場景,list更適合頻繁插入刪除的場景。
7…要對絕對地址0x100000賦值1234,如何實現
錯誤,實現不了
#include <stdio.h>
#include <stdlib.h>int main()
{int a = 1234;int* p = &a;scanf("%p",&p);printf("&=%d\n",*p);return(0);
}
正確
#include <stdio.h>int main() {int *ptr = (int *)0x100000;*ptr = 1234;printf("賦值完成\n");return 0;
}
直接對絕對地址進行操作在實際編程中要謹慎使用,并且這種操作可能存在一定的風險和限制,具體取決于運行環境和系統權限等因素。
struct name1{
char str;short x;int num;};
求sizeof(name1)
8
- 求函數返回值,
傳入-1,則在64位機器上函數返回()
int func(int x)
{int count =0;while(x) //while非0就是真{count++;x=x&(x-1); //與運算}
}return count;}
A死循環B:64C:32D:16
A
在 64 位機器上,對于有符號整數(如 int 類型):
其表示范圍通常是 -2^63 到 2^63 - 1。
即大致是 -9223372036854775808 到 9223372036854775807。
對于無符號整數(如 unsigned int 類型),表示范圍是 0 到 2^64 - 1。
-1 的二進制表示為所有位都是 1。在執行 x&(x-1) 操作時,每次會將最右邊的一個 1 變為 0,但因為初始的 x 是全 1,所以會不斷進行這個過程而無法使 x 變為 0 從而結束循環,因此函數不會返回一個確定的值,而是陷入死循環
- 求函數返回值
float a[3]={1.5,2.5,3.5};
*pa=a;
*(pa++)*=3;
,則*pa的值是()
A:1.5B:2.5C:3.5D:4.5
B
初始時 pa 指向數組 a 的首元素,
執行 (pa++)=3 ,先進行 *(pa) 即 a[0] 的值乘以 3 ,此時 a[0] 變為 4.5 ,然后 pa 向后移動一個位置指向 a[1] 。
所以此時 *pa 的值就是 a[1] 的值,即 2.5 。
- 求函數返回值
#include <stdlib.h>int main()
{
int a[5][5];int(*p)[4];p=a;printf("%p,%d\n",&p[4][2]-&a[4][2],&p[4][2]-&a[4][2]);return 0;
}
eg:原來:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 2223
24 25
現在*p[4] ; p代表的是列數:p[4,2]
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 1819
20
21 22 23 24
25
- 用C實現strstr,即在字符串中查找特定子串
#include <stdio.h>
#include <string.h>char *myStrStr(char *haystack, char *needle) {int haystackLen = strlen(haystack);int needleLen = strlen(needle);for (int i = 0; i <= haystackLen - needleLen; i++) {int j;for (j = 0; j < needleLen; j++) {if (haystack[i + j]!= needle[j]) {break;}}if (j == needleLen) {return haystack + i;}}return NULL;
}int main() {char str[] = "This is a test string";char subStr[] = "test";char *result = myStrStr(str, subStr);if (result) {printf("找到子串在: %s\n", result);} else {printf("未找到子串\n");}return 0;
}