零基础详解C语言指针进阶
目录
- 前言
- 1.字符指针
- 例题 1
- 2.指针数组
- 例题 2
- 3.数组指针
- 3.1数组指针的定义
- 3.2 &数组名与数组名
- 3.3 数组指针的使用
- 4.数组与指针在函数里的传参
- 4.1 一维数组的传参
- 4.2 二维数组的传参
- 4.3 一级指针的传参
- 4.4 二级指针的传参
- 5.函数指针
- 6. 函数指针数组
- 用函数指针数组实现一个计算器
- 7.回调函数
前言
这是指针的进阶,如果想入门指针的朋友可以关注我的另外一篇文章—c语言 指针零基础讲解
坚持看完,一定会有很大的收获~~
那接下来—起航
1.字符指针
我们目前知道整形指针,浮点型指针,字符指针跟他俩类型
字符指针—顾名思义就是指针,一个char*类型的指针
在讲解字符指针前,我先提一下怎么连续创建多个指针
连续创建多个指针的方法:
你可能会想到用:
int a ,b; int* a,b;
或者
#define PINT int* int main(){ int a ,b; p a,b; }
但是实际上这样创建的结果是:
创建一个整形指针int*a与整形变量int b.
创建指针的正确打开方式:
//方案一,直接定义两次 int a,b; int*a; int*b; //方案二,采用typedef重定义 typedef int* pint { int a,b; pint pa, pb;//此时就是定义int *pa与int *pb都是指针变量 return 0; }
下面给出一个简单的代码:
char ch='w'; char* p=ch; char* p="abcde";
定义一个char类型的变量ch,将ch地址放在指针变量p中
此时p存放的就是字符w的地址
这个很容易理解,那么char* p="abcde"是什么意思呢
实际上这次的p存放的是字符串abcde的首元素的地址,也就是a的地址
有了首地址,就很容易找到后续元素的地址
例题 1
判断下面代码是否相等 char arr1[] = "abcdef"; char arr2[] = "abcdef"; const char* str1 = "abcdef"; const char* str2 = "abcdef";
#include<stdio.h>//证明相等关系 int main() { char arr1[] = "abcdef"; char arr2[] = "abcdef"; const char* str1 = "abcdef"; const char* str2 = "abcdef"; if (arr1 == arr2) printf("arr1==arr2\n"); else printf("arr1!=arr2\n"); if (str1 == str2) printf("str1==str2\n"); else printf("str1!=str2\n"); return 0; }
为什么arr1!=arr2; str1==str2
首先创建数组,arr1与arr2,先向系统申请两个不同的空间,然后将abcdef放入两个不同的空间里,所以这两个空间的地址当然就不相同
其次是str1与str2的abcdef只存储在只读存储区(这跟const无关,const起到强调的作用,实际上有无const的意思是相同的),就是不能更改其中的元素;
这时候两字符串的内容相同,系统就不会在浪费多余的空间去储存两个不同的内容~
所以就形成str1==str2,实际上这两个变量储存的都是a的地址
2.指针数组
在这之前我们知道整形数组,浮点型数组等
意思就是储存整形与浮点型数子的数组
指针数组就是存放指针的数组,实际上还是数组,里面存放着不同类型的指针
int*arr[5];//整形指针数组 char*arr[5];//一级字符指针数组 char**arr[5];//二级字符指针数组
知道定义,那如何使用呢
例题 2
多组打印字符串
#include<stdio.h> int main()//指针数组 { char* arr[] = { "abcdef","ghi" ,"jklmn" }; //打印 int i = 0; int sz = sizeof (arr) / sizeof (arr[0]); for (i = 0; i < sz; i++) { printf("%s\n",arr[i]); } return 0; }
其中的 char* arr[] = { "abcdef","ghi" ,"jklmn" }就是指针数组,存放的就是char类型的指针,
他的作用就相当于:
char arr1[] = "abcdef"; char arr2[] = "ghi"; char arr3[] = "jklmn";
打印的结果就是:
打印整形的数组
#include<stdio.h> int main() { //打印整形数 int arr1[] = { 1, 2, 3, 4, 5}; int arr2[] = { 2, 3, 4, 5, 6}; int arr3[] = { 3, 4, 5, 6, 7}; int* arr[] = { arr1,arr2,arr3 }; int i = 0; int j = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { printf("%d", arr[i][j]); } printf("\n"); } return 0; }
3.数组指针
3.1数组指针的定义
有了指针数组的概念,相信很多人就知道数组指针的概念
跟你们想的一样
数组指针—就是指针,什么指针呢,存放数组的指针
int *pint;//能够指向整形数据的指针 char *p;//能够指向字符数据的指针 char (*p)[10];能够指向数组的指针
它的类型包括int(*)[], char(*)[]
解读一下,其中的(*)就代表是一个指针[]就代表是一个数组的指针,char或者int就代表数组中的数据是啥类型的元素