Loading... 8.1 指针 ====== 指针 (Pointer) , 一个表示变量地址的类型 示例1: int count = 10; int* ptr = &count; 其中, `int*` 是一种新的类型,称为“指针”类型 `ptr` 是`count`的地址,也可以称为“指向了count变量” 指针是指向了一个变量的地址,通过指针可以直接修改目标变量的值。 int count = 10; int* ptr = &count; *ptr = 11; 其中, `*ptr` 表示修改`ptr`目标的值 此操作称为“解指针”或“解引用” `dereference` 指针的作用 ----- 通过指针,可以修改目标变量的值 示例2: int a = 10; int b = 20; int* ptr = &a; // 指向a *ptr = 11; // 修改a的值 ptr = & b; // 指向 *ptr = 12; // 修改b的值 小结 -- 介绍了指针的概念:指针,即上一章所说的变量地址 int* ptr = &count; 指针有什么用:通过指针,可以修改目标变量的值 *ptr = … ; 8.2 指针的使用 ========= 指针的赋值 ----- ``` ptr = & a; // 把a的地址赋给ptr ptr = & b; // 把b的地址赋给ptr ``` 指针的解引用 ------ ``` *ptr = 12; (*ptr + 3) / k ``` 可以把 *ptr 视为一个整体,表示目标变量 示例1: ``` int a = 10; int* ptr = &a; // 指向a int b = *ptr + 3; int c = *ptr * 3; ``` 把目标的值代入表达式,即可 8.3 指针与数组 --------- 示例1: ``` int a[4] = { 12, 9, 32, 8 }; int* p0 = &a[0]; // 0号元素的地址 int* p1 = &a[1]; // 1号元素的地址 int* p2 = &a[2]; // 2号元素的地址 int* p3 = &a[3]; // 3号元素的地址 ``` 其中,a相当于有4个并排的int,而 &a[0] 就是0号元素的地址 观察: --- (1) 数组的首地址,和0号元素的地址有什么关系? int* ptr = &a; (2) 比较 p0 , p1, p2, p3 的值,看有什么关系? 指针算术: ----- 指针变量也支持加减法 示例2: int a[4] = { 12, 9, 32, 8 }; int* p = &a[0]; p++; // 此时p 指向 a[1] *p = 33; 其中,p++的意思是移到下一个元素的位置! 示例3: ``` int a[4] = { 12, 9, 32, 8 }; int* p0 = &a[0]; int* p1 = &a[1]; int result = p1 - p0; ``` 其中,p1 - p0 的结果是1,不是4 指针与数组完全相通 --------- 在C语言里,指针与数组是完全相通的 示例4, ``` int a[4] = { 12, 9, 32, 8 }; int* ptr = a; ptr[0] = 10; ptr[1] = 12; ``` 数组名可以转成指针,指针也可以当成数组名使用 示例5: ``` int a[4] = { 12, 9, 32, 8 }; int* ptr = a + 2; // ptr 指向 a[2] *ptr = 13; // a[2] 的值变成13 ptr[0] = 14; // a[2] 的值变成14 ptr[1] = 55; // a[3] 的值变成55 ``` 小结 -- 介绍了指针和数组的关系 1. 数组名可以转成指针,即首地址 2. 指针可以当成数组用,数组与可以当成指针用 8.4 指针常见问题 ========== 指针常见问题 1 空指针 2 野指针 3 指针越界 空指针 --- 空指针:值为0的指针,称这空指针 int* ptr = 0; 此时,ptr是一个内存地址,ptr为0,表示它不指向任何变量。 *ptr = 10; // 错! 由于ptr指向的内存地址为0,不是有效的变量,所以不能执行 *ptr 操作!( 程序崩溃 ) 野指针 --- 野指针:一个指针未指向有效的地址 例如, int* ptr; // 未指向任何变量 *ptr = 10; 此时,ptr 未初始化,这时执行 *ptr 操作是有危险的 ( 不允许胡乱修改内存的值 ) 指针越界 ---- 当指针用于数组操作时,不要越界 例如: int a[4] = { 12, 9, 32, 8 }; int* ptr = a + 2; ptr[2] = 12; // a[4], 越界! 小结 -- 总之,指针问题都是因为操作为了不可访问的内存! 指针,一定要搞清楚指向的目标,不要乱操作 最后修改:2020 年 10 月 31 日 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏