- 指针使用之前检查有效性
#include <stdio.h> int main() { int *p = NULL; //.... int a = 10; p = &a; if(p != NULL) { *p = 20; } return 0; }
4.1 指针±整数
#define N_VALUES 5 float values[N_VALUES]; float *vp; //指针+-整数;指针的关系运算 for (vp = &values[0]; vp < &values[N_VALUES];) { *vp++ = 0; }
将浮点型vp地址中的内容变成0,变五个地址
因为vp是一个float类型的·指针,所以对float类型的指针进行±.移动的是float个单位
4.2 指针-指针
我们之前用过strlen函数来求字符串长度,现在我们也可以用指针来求字符串长度
#include<stdio.h> #include<string.h> int main() { char str[] = "abcdef"; int len = strlen(str); printf("%d ", len); return 0; }
这是我们用strlen函数求出的字符串长度,现在我们用指针来求,定义一个函数my_strlen来求字符串长度
#include<stdio.h> int my_strlen(char* str) { int count = 0; while (*str != '\0') { count++; str++; } return count; } int main() { char str[] = "abcdef"; int len = my_strlen(str); printf("%d", len); return 0; }
当然我们之前也用过函数递归的思路来写代码,这里再带大家回忆一下
#include<stdio.h> int my_strlen(char* str) { if (*str != '\0') { return 1 + my_strlen(str+1); } } int main() { char str[] = "abcdef"; int len = my_strlen(str); printf("%d", len); return 0; }
我们现在至少掌握三种求字符串长度的求法
4.3 指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];) { *--vp = 0; }
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--) { *vp = 0
实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。
标准:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
5. 指针和数组
我们先来看一下下面这串代码
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,0}; printf("%p\n", arr); printf("%p\n", &arr[0]); return 0; }
可以看到他们的地址内容是相同的,而且我们再前面的学习中一直强调数组名是首元素地址,除了两个特例外(sizeof)(&),其他任何情况数组名就是首元素地址
既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; int* p = arr;//存放首元素地址 int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; for (i = 0; i < sz; i++) { printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p + i); } return 0; }
所以可以用指针来访问数组地址
所以 p+i 其实计算的是数组 arr 下标为i的地址。
6. 二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .
int b = 20;
*ppa = &b;//等价于 pa = &b;
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a
**ppa = 30; //等价于*pa = 30; //等价于a = 30;
7. 指针数组
指针数组是指针还是数组?
答案:是数组。是存放指针的数组。
数组我们已经知道整形数组,字符数组。
上面应该是int arr[4]
那么我们的指针数组是啥样的呢
指针也讲完了,后期还会更深入地了解指针,因为指针真的很重要,你会C语言必须得会指针,今天我们地分享就到这里了,谢谢大家得支持,你们的支持就是我的动力,拜拜