文章目录
- 一、char类型指针
- 二、野指针
- 三、空指针
- 四、const指针
- 五、void指针
- 六、二维指针(二级指针)
- 七、函数指针
- 八、指针的万能拆解方法
- 总结
一、char类型指针
char类型的指针:一般指向字符与字符串类型的常量,用于操作字符与字符串。
char *c = "hello world"
//输出hello world
printf("%s\n", c);
#include<stdio.h>
#include<stdlib.h>
int main(){
//char类型的指针,通常指向字符或字符串,用于操作字符或字符串
char *ch = "hello char";
printf("%s\n", ch);
}
运行结果:
二、野指针
在定义时未能给定指针的指向,或者是指针的指向的地址空间被释放了。
int *p;//该指针为野指针
int *q = malloc(100);
free(q);//释放空间后指针变为野指针。
三、空指针
定义的指针指向NULL,最小的地址0x00000000.
int *p = NULL;//p为空指针。
四、const指针
1.const修饰指针,指针不能被修改(常指针)。
int a = 100;
int * const p = &a;
//p无法被修改
2.const修饰指针所指向的目标,无法通过指针修改其目标的值(常量指针)。
int a = 100;
int const *p = &a;
*p = 1000;//无法修改a的值
五、void指针
无法确定其指针指向的指针。
该指针无法进行加减运算。
作用:
指针指向不确定的变量。
用该指针作为函数的参数,代表该函数的参数不确定。
用该指针作为函数的返回值,代表该函数的返回值不确定。
void *p = malloc(100);//malloc为指针p开辟一个100字节长度的空间。
*(int *)p = 100;//该指针指向常量时需要进行类型强制转换。
printf("%d\n", *(int *)p);//用该指针输出内容时也要进行类型强制转换。
六、二维指针(二级指针)
二维指针就是指向指针的指针
int a = 100;
int *p = &a;//让一级指针指向了变量a
int **q = &p;//让二级指针q指向了一级指针p
//输出a的内容;
printf("%d\n", a);
printf("%d\n", *p);
printf("%d\n", **q);
//输出a地址
printf("%p\n", &a);
printf("%p\n", p);
printf("%p\n", *q);
//二级指针与一级指针一样可以进行加减运算。
//利用二级指针修改a的内容。
**q = 1000;
printf("%d\n", a);//输出1000;
七、函数指针
函数指针本质上是一个指针,其指向的类型为函数。
//定义一个函数指针,该指针指向的类型为int (int ,int )函数,就是函数的返回值为int类型,且函数的参数类型为两个int类型的参数。
int (*p) (int,int) = NULL;
//p = &f;//f为函数名
//&取地址符可以省略
p = f;
//调用函数
//(*p)(10,20);
//*解引用可以省略
p(10,20);
八、指针的万能拆解方法
根据亲和性,去拆解指针,更方便我们理解。(这只是一种指针的理解方法)
char ( * p1 ); // 第2部分*p1说明改变量是指针类型,第1部分char说明该指针指向的类型为char类型变量。char * ( * p2 ); // 第 2 部分 *p2说明该变量是一个指针类型; 第 1 部分 char *说明该指针指向的类型为char*类型的指针变量;char ** ( * p3 ); // 第 2 部分p3说明该变量是一个指针类型; 第 1 部分:char **说明该指针指向的类型为char**类型的二级指针变量;char ( * p4 )[ 3 ]; // 第 2 部分*p4说明该变量是一个指针类型; 第 1 部分char [3]说明该指针指向的类型为char[3]数组;char ( * p5 )( int , float ); // 第 2 部分*p5说明该变量是一个指针类型; 第 1 部分char (int, float)说明该指针指向的类型为返回值为char类型,参数类型为1个int类型变量和一个float类型变量;
总结
二级指针比较难理解,大家可以自己多画画图,多敲敲代码,或者去b站上搜索看看解析。