C语言中的指针进阶

文章目录

  • 一、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站上搜索看看解析。

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值