行业知识
C语言第十八弹---指针(二)
2026-10-19 13:06:34
来源:互联网转载
✨个人主页:��熬夜学编程的小林
系列专栏: 【C语言详解】 【数据结构详解】
指针
1、const修饰指针
1.1、const修饰变量
1.2、const修饰指针变量
2、指针运算
2.1、指针+- 整数
2.2、指针-指针
2.3、指针的关系运算
3、野指针
3.1、野指针成因
3.2、如何规避野指针
3.2.1、指针初始化
3.2.2、小心指针越界
3.2.3、指针变量不再使用时,及时置NULL,指针使用之前检查有效性
3.2.4、避免返回局部变量的地址
4、assert断言
5、指针的使用和传址调用
5.1、strlen的模拟实现
5.2、传值调用和传址调用
总结
1、const修饰指针
1.1、const修饰变量
变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个 变量加上⼀些限制,不能被修改 ,怎么做呢?这就是 const的作用。#include int main(){ int m = 0; m = 20;//m是可以修改的 const int n = 0; n = 20;//n是不能被修改的 return 0;} 上述代码中 n是不能被修改的 ,其实n本质是变量,只不过 被const修饰后,在语法上加了限制 ,只要我们在代码中 对n进行修改 ,就 不符合语法规则 ,就报错, 致使没法直接修改n。 但是如果我们绕过n,使用n的地址,去修改n就能做到了,虽然这样做是在打破语法规则。 #include int main(){ const int n = 0; printf("n = %d\n", n); int*p = &n; *p = 20; printf("n = %d\n", n); return 0;} 输出结果: 我们可以看到这里确实修改了,但是我们还是要思考⼀下,为什么n要被const修饰呢?就是为了不能被修改,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让p拿到n的地址也不能修改n,那接下来怎么做呢? 1.2、const修饰指针变量
我们看下面代码,来分析#include //代码1void test1(){ int n = 10; int m = 20; int *p = &n; *p = 20;//ok? p = &m; //ok?}void test2(){ //代码2 int n = 10; int m = 20; const int* p = &n; *p = 20;//ok? p = &m; //ok?}void test3(){ int n = 10; int m = 20; int *const p = &n; *p = 20; //ok? p = &m; //ok?}void test4(){ int n = 10; int m = 20; int const * const p = &n; *p = 20; //ok? p = &m; //ok?}int main(){ //测试无const修饰的情况 test1(); //测试const放在*的左边情况 test2(); //测试const放在*的右边情况 test3(); //测试*的左右两边都有const test4(); return 0;} 结论:const修饰指针变量的时候 • const如果放在 *的左边 ,修饰的是 指针指向的内容 ,保证指针指向的内容 不能通过指针来改变。 但是指针变量本身的内容可变。 • const如果放在 *的右边 ,修饰的是 指针变量本身 ,保证了指针变量的内容 不能修改 ,但是指针指向的内容,可以通过指针改变。 2、指针运算
指针的基本运算有三种,分别是: • 指针+- 整数 • 指针-指针 • 指针的关系运算2.1、指针+- 整数
因为数组在内存中是连续存放的,只要知道第⼀个元素的地址,顺藤摸瓜就能找到后面的所有元素。 指针+/-整数是另一个指针,+-的大小为指针类型大小。(暂时先简单了解,后序指针会详细讲解)int arr[10] = {1,2,3,4,5,6,7,8,9,10}; #include //指针+- 整数int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &arr[0];//首元素地址 int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); for(i=0; i
下一篇:优化服务器怎么样了?