4.1 指针+-整数
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)
4.2 指针-指针
代码实例:
代码1:
//指针-指针 //前提:两个指针要指向同一块空间 #include<stdio.h> int main() { int arr[10] = { 0 }; printf("%d\n", &arr[9] - &arr[0]);//9 printf("%d\n", &arr[0] - &arr[9]);//-9 //注意:必须是指向同一块空间 //char arr1[5] = { 0 }; //printf("%d\n", &arr1[0] - &arr[2]);//编译器警告:从“int*”到char*的类型不兼容 return 0; }
代码2:
写一个函数求字符串的长度
//写一个函数求字符串的长度 //1、计数器 //2、指针-指针 //3、递归 #include<stdio.h> //计数器 int my_strlen(char* str) { int count = 0; //求字符串的长度,其实是统计\0之前的字符的个数 while (*str != '\0') { count++; str++; } return count; } //指针-指针 int my_strlen1(char* str) { char* start = str; while (*str != '\0') { str++; } return str - start; } //递归 int my_strlen2(char* str) { if (*str != '\0') { return 1 + my_strlen2(str + 1); } else { return 0; } } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); int len1 = my_strlen1(arr); int len2 = my_strlen2(arr); printf("%d %d %d\n", len,len1,len2); return 0; }
4.3 指针的关系运算(比较指针的大小)
实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与第一个元素之前的那个内存位置的指针进行比较。
5. 数组和指针
指针与数组不等价,理解:
1、指针和数组是不同的对象
①指针是一种变量,存放地址的,大小4/8字节
②数组是一组相同类型元素的集合,是可以放多个元素的,大小取决于元素个数和元素的类型
2、(二者的联系)数组的数组名是数组首元素的地址,地址可以放在指针变量中,通过指针访问数组
代码实例:
#include<stdio.h> int main() { int arr[10] = { 0 }; //通过指针来给数组赋值1~10 int* p = arr; int i = 0; for (i = 0; i < 10; i++) { *(p + i) = i + 1; } //通过指针来打印数组 p = arr; for (i = 0; i < 10; i++) { printf("%d ", *(p + i)); } printf("\n"); //通过数组下标来打印数组 for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
6. 二级指针
二级指针是什么?
指针变量也是变量,有变量就有地址,存放一级指针变量的地址的变量就是二级指针。
对于二级指针的运算有:
①*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa
②**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a
代码实例:
#include<stdio.h> int main() { int a = 10; int * pa = &a;//一级指针变量 int* * ppa = &pa;//二级指针变量 //int*** ppa = &ppa;//三级指针变量 **ppa = 50; printf("%d\n", a);//50 return 0; }
7. 指针数组
指针数组是指针还是数组?
答案是:数组,是存放指针的数组。
上面只是让我们更好的理解指针数组,但是指针数组是怎么使用的呢?
代码实例:
使用一维数组,模拟一个3行4列的二维数组
//使用一维数组,模拟一个3行4列的二维数组 #include<stdio.h> int main() { int a[4] = { 1, 2, 3, 4 }; int b[] = { 2, 3, 4, 5 }; int c[] = { 3, 4, 5, 6 }; int* arr[3] = { a, b, c }; //打印 int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }