C语言指针进阶一:(字符指针,数组指针,指针数组,函数指针)

字符指针

在指针类型中我们知道字符指针类型,一般就是用于 char 的:
 

int main()
{
	char ch = 'w';
	char* p = &ch;
	*p = 'a';
	return 0;

}

还有一种使用方法:

int main()
{
	const char* pstr = "hello bit";
	printf("%s\n", pstr);
	return 0;
}

上述代码中放入指针 pstr 中的不是整个字符串,而是字符串首字符的地址放到了指针中,就是说字符 h 的地址放到了指针中。(如果字符串是表达式的话,他的值是首字符的地址)。

 上述代码会输出什么?

 因为用相同的常量字符串初始化不同的数组时会开辟出不同的空间,自然就不一样了,而 str3 和 str4指向的是同一个常量字符串,是同一个内存空间,所以是相同的。

指针数组

之前的文章有讲过

数组指针

数组指针是数组还是指针,答案是指针,是指向一个数组的指针。

我们看看数组指针是什么样子的:
 

int* p1[10];//指针数组

int (*P)[10];//数组指针

*先与p结合说明是指针,int [10]说明指向的是一个整形数组。

&数组名

之前知道数组名一般是首元素的地址,只有sizeof和&不是,当&数组名时,取出的是整个数组的地址,他的类型就是数组指针,+1跳过整个数组的大小。

数组指针的使用

数组指针一般有什么用,一般是二维数组传参的时候

 二维数组传参可以写这两种方式,但是因为数组名是首元素的地址,二维数组的首元素地址是第一行的地址,也就是一个一维数组的地址,所以要用数组指针来接收。

特殊代码

int (*parr[10])[5];

请问这个代码的含义,来分析:

 先将移去的看做是整体,可以看出剩下的是一个数组指针的类型,再看parr[10]有元素,说明这是一个数组,存放数组指针的数组。

特别提示二维数组传参的时候,函数参数中 [2][5] 第一个[]可以省略,第二个不可以。

函数指针

 会输出什么

这两个地址都是函数的地址,函数地址该怎么保存?

void (*pfun1)();
//*先与pfun1结合说明是指针,指向的函数返回类型是void,()里没有参数

int (*pfun2)(int,int);
//指向的函数返回类型是int,参数类型是int,int

这就是函数指针类型。(同时我们知道了函数名就是函数的地址,函数指针可以直接用于函数调用

特殊代码

(*(void (*) () )0) ();



void (*signal(int, void(*)(int) ) )(int);

先分析第一个代码:

被拿下的部分是函数指针类型,说明是一个类型转换,解引用类型转换之后的0,说明是调用0地址处的函数,没有参数。

第二个代码:

当移去部分后,剩下的是一个函数指针类型,再看移去的部分,像是一个函数声明,参数类型是 int和函数指针类型,说明这就是一个函数声明,参数有两个,返回类型是函数指针类型。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值