C语言指针进阶

本文详细介绍了C语言中的指针类型,包括字符指针、整型指针、数组指针和函数指针的使用。此外,还阐述了二维数组在传参中的应用,并解析了易错的sizeof()和strlen()函数的区别。最后,讨论了二级指针的概念,它是如何存储一级指针地址的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、不同类型的指针

二、数组指针的使用——二维数组传参

三、二级指针传参

四、函数指针

五、指针与数组易错题讲解sizeof() strlen()


一、指针分类

指针类型的意义:指针类型决定了该指针在解引用操作后所能访问空间的大小(字节),也决定了指针的步长。

//char *   字符指针

char m='w';

char*p=&m

//int*       整型指针

int m=2;

int*p=&m;

数组指针——存放数组的地址

int arr[10];

int (*p)[10]=&arr;

其中 int (*)[10]为数组指针类型

函数指针——存放函数的地址

函数地址:&函数名==函数名

函数指针:返回类型+(*变量名)+(参数类型)

int Add(int x,int y){

      .....

}

int (*p)(int,int)=&Add;//存放

(*p)(2,3);  //调用

二级指针——存放一级指针的地址

int m=2;

int*p=&m;

int**p=&p 


二、二维数组传参

二维数组:arr[3][4] 可以想象成3个元素的数组,每个元素是由4个元素组成的数组

二维数组传参:

数组名==数组首元素地址

arr==二维数组首元素地址  二维数组首元素==arr[0] 

而arr[0]是一个4个元素大小的数组,数组的地址数组指针表示 故使用int (*p)[4]作为接收函数的形参


三、二级指针传参

思考:

void test(int **p)

对应的函数test()可以传什么样的参数呢?

 函数的形参为二级指针,故它可以传满足一下条件之一的参数:

(1)int **ptr

         test(ptr)  //二级指针

  (2)  int *ptr

        test(&ptr)  //一级指针的地址

  (3)  int*arr[10]

        test(arr)  //指针数组的数组名==指针数组的首元素地址==(int*)类型元素的地址==int**


四、函数指针

函数的地址:&函数名 或 函数名

函数指针构成: 返回类型(*变量名)(参数类型)

int Add(int x, int y)

{

        return x+y;

}

函数指针设置

int (*p)(int,int)=&Add

int (*p)(int,int)=Add

调用

int sum=(*p)(2,3)

int sum=p(2,3)

函数指针数组:

int (*pArr[2])(int,int)={Add,Sub}

pArr 先和 [] 结合,说明 pArr是数组,数组的内容是int (*)(int,int)类型的函数指针

存放返回类型参数类型一致的函数地址

pArr[0](2,3)=5  执行Add(2,3)

pArr[1](2,3)=-1        Sub(2,3)


五、易错题

sizeof()是操作符,返回一个变量或者类型的大小(以字节为单位)。

strlen()是库函数,从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

数组名的意义:
1. sizeof( 数组名 ) ,这里的数组名表示整个数组,计算的是整个数组的大小。
2. & 数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值