嵌入式大厂面经 4(持续更新中!)
1. 指针的大小
- 指针大小与系统架构相关,而不是与指向的数据类型相关
- 32位系统:所有指针都是4字节
- 64位系统:所有指针都是8字节
示例代码:
void testPointerSize(void) {
char *p1;
int *p2;
double *p3;
void *p4;
int (*p5)(int); // 函数指针
printf("char*: %d\n", sizeof(p1)); // 32位系统为4,64位为8
printf("int*: %d\n", sizeof(p2)); // 同上
printf("double*: %d\n", sizeof(p3)); // 同上
printf("void*: %d\n", sizeof(p4)); // 同上
printf("function*: %d\n", sizeof(p5)); // 同上
}
2. 函数指针和指针函数
函数指针
- 指向函数的指针
- 用于回调函数、函数表等场景
// 函数指针示例
typedef int (*Operation)(int, int); // 定义函数指针类型
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
void testFunctionPointer(void) {
Operation op = add; // 函数指针指向add函数
printf("Result: %d\n", op(5, 3)); // 输出8
op = sub; // 切换到sub函数
printf("Result: %d\n", op(5, 3)); // 输出2
}
指针函数
- 返回指针的函数
- 常用于动态内存分配、数组操作等
// 指针函数示例
int* createArray(int size) {
return (int*)malloc(size * sizeof(int));
}
char* getString(void) {
return "Hello World";
}
void testPointerFunction(void) {
int* arr = createArray(5); // 返回int指针
char* str = getString(); // 返回char指针
// 使用完需要释放动态分配的内存
free(arr);
}
3. strlen 和 sizeof 的区别
主要区别
- 类型strlen:函数,计算字符串长度sizeof:运算符,计算数据类型或变量的字节数
- 使用场景strlen:只用于字符串sizeof:可用于任何数据类型
- 计算方式strlen:遇到'\0'结束sizeof:编译时确定
示例代码:
void compareStrlenSizeof(void) {
char str[] = "Hello";
char *ptr = "World";
printf("strlen(str) = %d\n", strlen(str)); // 输出5
printf("sizeof(str) = %d\n", sizeof(str)); // 输出6(包含'\0')
printf("strlen(ptr) = %d\n", strlen(ptr)); // 输出5
printf("sizeof(ptr) = %d\n", sizeof(ptr)); // 32位系统输出4,64位输出8
// 数组示例
int arr[10];
printf("sizeof(arr) = %d\n", sizeof(arr)); // 输出40(10*4字节)
}
注意事项
- strlen 不计算'\0',sizeof 计算所有字节
- sizeof 是编译时运算符,strlen 是运行时函数
- sizeof 可以用于未初始化的数组,strlen 必须用于以'\0'结尾的字符串
这些概念在C语言编程中非常重要,尤其是在内存管理和字符串处理方面。理解它们的区别和使用场景对于写出高质量的代码至关重要。
更多内容全在下方专栏
全网最受欢迎的嵌入式笔试专栏
笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学
3000+订阅还会涨价,提前订阅提前享受,持续更新中。
专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
#嵌入式笔面经分享#