C语言指针详解第五部分(包含易错笔试题)
在C语言中,指针是一个非常重要且强大的概念。以下是关于C语言指针的第五部分详细解说,包括一些常见的易错笔试题。
指针高级特性
1. 指针的算术运算
指针可以进行算术操作,如加减法。在C中,指针的加法和减法是以指针所指向的数据类型的大小为步长单位的。
int arr[] = {10, 20, 30, 40};
int *ptr = arr;
ptr++; // 现在 ptr 指向 arr[1],即值为 20
2. 指向指针的指针(多级指针)
指针不仅可以指向基本数据类型,还可以指向其他指针。这就形成了多级指针。
int num = 10;
int *ptr = #
int **ptr2 = &ptr;
这里,ptr2
是一个指向指针的指针,它可以通过 *ptr2
得到 ptr
的值,或者通过 **ptr2
来获取 num
的值。
3. 常量指针(指向常量的指针 & 指针常量)
- 常量指针(指向常量的指针,即不能通过该指针修改值):
const int *ptr = # // *ptr = 20; // 错误:不允许修改 num = 20; // 允许通过其它途径修改
- 指针常量(指针的值是常量,即指针始终指向初始化时的变量):
int *const ptr = # // ptr = &another_num; // 错误:不允许修改指针的指向 *ptr = 30; // 允许通过该指针修改指向的值
4. 函数指针
指针不仅可以指向数据,还可以指向函数,从而实现回调和函数的动态调用。
int add(int a, int b) {
return a + b;
}
int (*funcPtr)(int, int) = add;
int result = funcPtr(2, 3); // 调用 add 函数
易错笔试题解析
题目1:指针和数组的差别
void func(int arr[]) {
printf("%ld\n", sizeof(arr) / sizeof(int));
}
int main() {
int arr[10];
printf("%ld ", sizeof(arr) / sizeof(int)); // 输出数组长度
func(arr); // 输出什么?
return 0;
}
解析:在main
中,sizeof(arr)
是 10 * sizeof(int)
,输出10。而在func
中,arr
相当于一个指针指向数组的首元素,sizeof(arr)
是指针的大小(通常是4或8字节),输出不等于10。
题目2:二级指针解引用
int main() {
int num = 10;
int *ptr = #
int **ptr2 = &ptr;
**ptr2 = 20;
printf("%d\n", num); // 输出什么?
return 0;
}
解析:**ptr2
是 num
的值,通过ptr2
的解引用可以修改num
。所以输出是20。
题目3:指针越界访问
int main() {
int arr[3] = {1, 2, 3};
int *ptr = arr + 3;
printf("%d\n", *ptr); // 输出什么?
return 0;
}
解析:ptr
指向arr
之外的存储区域,*ptr
结果是未定义行为,可能会导致程序错误崩溃或输出垃圾值。
理解和掌握这些指针知识以及常见的误用,可以帮助避免在编程时犯错误。希望这部分内容对你在理解C语言指针时有所帮助!